当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么在winapi中转换UTF16->UTF8->UTF16后,filename有不同的字节?》经验,为你挑选了1个好方法。

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

我使用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]

为什么?



1> user694733..:

57216似乎属于代理对范围,在UTF-16中用于编码非BMP代码点.它们需要成对出现,否则解码将无法为您提供正确的代码点.

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

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

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

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有