【问题标题】:UTF-16 to UTF8 with WideCharToMultiByte problems带有 WideCharToMultiByte 问题的 UTF-16 到 UTF8
【发布时间】:2014-05-25 19:12:26
【问题描述】:
int main(){
//"Chào" in Vietnamese
wchar_t utf16[] =L"\x00ff\x00fe\x0043\x0000\x0068\x0000\x00EO\x0000\x006F";
//Dump utf16: FF FE 43 0 68 0 E 4F 0 6F (right)
int size = WideCharToMultiByte(CP_UTF8,0,utf16,-1,NULL,0,NULL,NULL);
char *utf8 = new char[size];
int k = WideCharToMultiByte(CP_UTF8,0,utf16,-1,utf8 ,size,NULL,NULL);
//Dump utf8: ffffffc3 fffffbf ffffc3 ffffbe 43 0
}

这是我的代码,当我将它的字符串转换为 UTF-8 时,它显示错误的结果,那么我的代码有什么问题?

【问题讨论】:

  • 对于初学者,您可能想要转换整个数组,即使它不是一个宽字符串:它嵌入了零。
  • 另外,unicode 不是 utf-16 的同义词。
  • @Deduplicator 不幸的是,微软不这么认为。
  • 那么你能提出一个解决方案吗?如何在 C++ 中正确地制作一个 utf-16 字符串
  • @MarkRansom:没有理由增加混乱。此外,OP 肯定会很快发现 UTF-32,就像他已经为 UTF-8 所做的那样。

标签: c++ windows unicode utf-8 utf-16


【解决方案1】:

您正在错误地读取文件。您的输入转储以宽字符显示单个字节。您的输出转储是将L"\xff\xfe\x43" 编码为UTF-8 产生的字节序列。字符串在输入中的第一个 \x0000 处被截断。

【讨论】:

    【解决方案2】:
    wchar_t utf16[] = L"\uFEFFChào";
    int size = 5;
    
    for (int i = 0; i < size; ++i) {
        std::printf("%X ", utf16[i]);
    }
    

    这个程序打印出来:FEFF 43 68 E0 6F

    如果打印出您从文件中读取的每个 wchar_t,则打印出 FF FE 43 0 68 0 E 4F 0 6F,则 UTF-16 数据未从文件中正确读取。这些值表示 UTF-16 字符串:`L" ÿþC\0h\0à\0o"。

    您没有显示从文件中读取的代码,但这是正确执行此操作的一种方法:

    https://stackoverflow.com/a/10504278/365496

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 2011-01-07
      • 2011-03-23
      • 2019-11-29
      • 2016-03-06
      • 1970-01-01
      • 2013-02-25
      • 2019-02-02
      相关资源
      最近更新 更多