In the initial description you talk about "unicode". Unicode characters can be saved using different encodings, this can be UTF-8, UTF-16 and so on. We cannot know which encoding the filename of a file on disk was used.
Yes, we can assume UTF-16 or we can assume UTF-8, maybe even both by trying. But then the next user wants UTF-32 BE, then UTF-32 LE and whatever else.
The behaviour is probably very similar on non-Windows platforms. I think usually filenames should follow the system's locale. Mixed charsets are never a good idea.
Anyway, I don't know how I could create a file on Windows with a filename not in the system's locale and so cannot really test it. I just tested your changes with non-ASCII filenames in the system's locale and it still works.
Before this could get merged, two remarks: - could you try to handle argv[0] as well as mentioned above - it'd be nice if you could move the Windows specific code into a new function in src/win32.c, then src/main.c gets less cluttered. Usually we try to have the weird Windows-specific ~~hidden~~abstracted in src/win32.c :)