宽字符串字面值

时间:2014-10-04 21:55:44

标签: c wchar-t

我在Windows上使用MinGW GCC编译器时遇到了宽字符串文字的麻烦。

当我使用wscanf阅读用户输入时,wprintf输出正确的国家字符。但是,宽字符串文字会在第一个国家字符处停止输出:

wprintf (L"China - Čína"); // outputs "China - "

假设wchar_t默认编码为UTF-16(是LE还是BE?),当源是UTF-8文件时它是如何工作的?我试图将源保存为UTF-16,但是我得到非法字节序列错误。

1 个答案:

答案 0 :(得分:2)

正如@pasztorpisti建议的那样,我尝试了内存查看器,子串Čína存储为0C 01 ED 00 6E 00 61 00,这在UTF-16LE中是正确的。

我的控制台使用CP852作为默认代码页,所以我尝试了chcp 1200但是没有设置! MSDN says仅适用于托管应用程序 - Microsoft知道如何创建编码地狱。

仔细阅读this answer非常有用:我使用WriteConsoleW在cripled控制台中生成UTF-16LE输出:

void putws(const wchar_t* str) {
  WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, wcslen(str), NULL, NULL);
}

putws(L"China - Čína"); // outputs "China - Čína"