C++ 对于UTF-8,PathFileExistsA失败?

C++ 对于UTF-8,PathFileExistsA失败?,c++,visual-studio,utf-8,C++,Visual Studio,Utf 8,我正在使用VS2017,需要支持UTF-8路径,因为SDK只支持UTF-8。在我的代码中,我想测试UTF-8路径是否有效,所以我使用 PathFileExistsA( path ); 但我知道一条路径是有效的,它失败了。(如果“path”只有ascii字符,则它会通过——没有需要UTF-8的字符) 我意识到PathFileExistsA中的“A”代表Ascii,但这不包括UTF-8?它的对应项是PathFileExistsW,但我不能使用宽字符 我要做的就是测试UTF-8路径是否有效,以便在更

我正在使用VS2017,需要支持UTF-8路径,因为SDK只支持UTF-8。在我的代码中,我想测试UTF-8路径是否有效,所以我使用

PathFileExistsA( path );
但我知道一条路径是有效的,它失败了。(如果“path”只有ascii字符,则它会通过——没有需要UTF-8的字符)

我意识到PathFileExistsA中的“A”代表Ascii,但这不包括UTF-8?它的对应项是PathFileExistsW,但我不能使用宽字符


我要做的就是测试UTF-8路径是否有效,以便在更合适的情况下使用另一个函数。

Windows本机使用UTF-16(宽字符)作为其API。如果不能将宽字符用于输入,则可以将其作为UTF-8接受,并使用
MultiByteToWideChar()
将其转换为宽字符,然后调用API函数的宽字符版本:

char* lpUtf8 = ...;
// Look up the size of the wide string
size_t wideSize = ::MultiByteToWideChar( CP_UTF8, 0, lpUtf8, -1, 0, 0 );
// Allocate the string
wchar_t* lpWideString = new wchar_t[wideSize];
// Do the conversion
::MultiByteToWideChar( CP_UTF8, 0, lpUtf8, -1, lpWideString, wideSize );
// Call the wide function
::PathFileExistsW( lpWideString );
// Deallocate the string
delete[] lpWideString;
如果使用STL字符串函数,会更干净。这篇文章很好:


Windows本机使用UTF-16(宽字符)作为其API。如果不能将宽字符用于输入,则可以将其作为UTF-8接受,并使用
MultiByteToWideChar()
将其转换为宽字符,然后调用API函数的宽字符版本:

char* lpUtf8 = ...;
// Look up the size of the wide string
size_t wideSize = ::MultiByteToWideChar( CP_UTF8, 0, lpUtf8, -1, 0, 0 );
// Allocate the string
wchar_t* lpWideString = new wchar_t[wideSize];
// Do the conversion
::MultiByteToWideChar( CP_UTF8, 0, lpUtf8, -1, lpWideString, wideSize );
// Call the wide function
::PathFileExistsW( lpWideString );
// Deallocate the string
delete[] lpWideString;
如果使用STL字符串函数,会更干净。这篇文章很好:


Windows本机并不真正支持UTF-8。是什么让你相信它这么做的?”我意识到PathFileExistsA中的“A”代表Ascii”-不,它代表ANSI。Win32“A”函数希望数据位于用户的当前区域设置中,而不是UTF-8中。“它的对应项是PathFileExistsW,但我不能使用宽字符”-是的,你可以,而且应该。Win32“W”函数与UTF-16配合使用,在UTF之间进行转换是无损的。@Remy,感谢您提供有关UTF-8的信息。非常有用。关于wide char,我当然可以在我的应用程序中使用它们,但我不能将它们传递给我正在使用的SDK,因为它不支持它们。它只支持UTF-8,这很好。正如我所说,您可以在需要时在UTF-8和UTF-16之间进行转换,而不会丢失任何数据。Win32 API支持UTF-16,但不支持UTF-8,这是Windows上的一个事实。你必须解决这个问题。Windows在本机上并不真正支持UTF-8。是什么让你相信它这么做的?”我意识到PathFileExistsA中的“A”代表Ascii”-不,它代表ANSI。Win32“A”函数希望数据位于用户的当前区域设置中,而不是UTF-8中。“它的对应项是PathFileExistsW,但我不能使用宽字符”-是的,你可以,而且应该。Win32“W”函数与UTF-16配合使用,在UTF之间进行转换是无损的。@Remy,感谢您提供有关UTF-8的信息。非常有用。关于wide char,我当然可以在我的应用程序中使用它们,但我不能将它们传递给我正在使用的SDK,因为它不支持它们。它只支持UTF-8,这很好。正如我所说,您可以在需要时在UTF-8和UTF-16之间进行转换,而不会丢失任何数据。Win32 API支持UTF-16,但不支持UTF-8,这是Windows上的一个事实。你必须解决这个问题。