具有WideCharToMultiByte问题的UTF-16到UTF8

时间:2014-04-11 14:46:39

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

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时,它显示错误的结果,所以我的代码有什么问题?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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