为什么在winapi中转换UTF16 – > UTF8 – > UTF16后,filename有不同的字节?

我有下一个文件: 在此处输入图像描述

我使用ReadDirectoryChangesW来读取当前文件夹中的更改。 我得到了这个文件的路径:L“TESTӠ⬨☐.ipt”:

在此处输入图像描述

接下来,我想将其转换为utf8并返回:

std::string wstringToUtf8(const std::wstring& source) { const int size = WideCharToMultiByte(CP_UTF8, 0, source.data(), static_cast(source.size()), NULL, 0, NULL, NULL); std::vector buffer8(size); WideCharToMultiByte(CP_UTF8, 0, source.data(), static_cast(source.size()), buffer8.data(), size, NULL, NULL); } std::wstring utf8ToWstring(const std::string& source) { const int size = MultiByteToWideChar(CP_UTF8, 0, source.data(), static_cast(source.size()), NULL, 0); std::vector buffer16(size); MultiByteToWideChar(CP_UTF8, 0, source.data(), static_cast(source.size()), buffer16.data(), size); } int main() { // Some code with ReadDirectoryChangesW and // ... // std::wstring fileName = "L"TEST Ӡ⬨☐.ipt"" // ... std::string filenameUTF8 = wstringToUtf8(fileName); std::wstring filename2 = utf8ToWstring(filenameUTF8); assert(filenameUTF8 == filename2); // FAIL! return 0; } 

但我抓住断言。 文件名2: 在此处输入图像描述

不同的位:[29]

为什么?

57216似乎属于代理对范围,在UTF-16中用于编码非BMP代码点。 它们需要成对出现,否则解码不会给你正确的代码点。

65533是解码器给出的特殊错误字符,因为缺少其他代理。

换句话说:你的原始字符串是无效的UTF-16字符串。

关于维基百科的更多信息 。