+6  A: 

NTFS stores filenames in UTF16, however fopen is using ANSI (not utf8).

In order to use an UTF16-encoded file name you will need to use the Unicode versions of the file open calls. Do this by defineing UNICODE and _UNICODE in your project. Then use the CreateFile call or the wfopen call.

villintehaspam
If changing the project to build with UNICODE defined is too large of a change, you can call `wfopen()` or `CreateFileW()` in a non-unicode build.
Michael Burr
+3  A: 

fopen() - in MSVC on windows does not (by default) take a utf-8 encoded char*.

Unfortunately utf-8 was invented rather recently in the great scheme of things. Windows APIs are divided into Unicode and Ansi versions. every windows api that takes or deals with strings is actually available with a W or A suffix - W for "Wide" character/Unicode and A for Ansi. Macro magic hides all this away from the developer so you just call CreateFile with either a char* or a wchar_t* depending on your build configuration without knowing the difference.

The 'Ansi' encoding is actually not a specific encoding:- But means that the encoding used for "char" strings is specific to the locale setting of the PC.

Now, because c-runtime functions - like fopen - need to work by default without developer knowledge - on windows systems they expect to receive their strings in the windows local encoding. msdn indicates the microsoft c-runtime api setlocal can change the locale of the current thread - but specifically says that it will fail for any locales that need more than 2 bytes per character - like utf-8.

So, on Windows there is no shortcut. You need to use wfopen, or the native API CreateFileW (or create your project using the Unicode build settings and just call Createfile) with wchar_t* strings.

Chris Becke