2014-10-04 68 views
0

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

当我使用wscanf读取用户输入时,wprintf输出正确的国家字符。

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

假设wchar_t的被编码为UTF-16由默认(是LE或BE?),它是如何当该源为UTF-8工作:然而宽字符串文字在第一民族性停止输出文件?我试图将源码保存为UTF-16,但我得到非法字节序列错误。

+0

您的源代码的编码是不相关的程序所使用的编码当它运行时。只要编译器知道它是什么以便它可以将字符串文本转换为运行时字符集,您的源代码就可以使用任何您想要的编码。 – Wyzard 2014-10-04 22:02:53

+0

包括'',然后在那里有'wprintf'这行之前调用'setlocale(LC_ALL,“sk”);'(或''cz“',或者其中任何一种语言”Čína“在)应该正确显示你放的文字。但是,它没有。我没有用倒转的口音打印“Č”。对不起...... – ThoAppelsin 2014-10-04 22:27:06

+1

用调试器中的内存视图检查包含字符串的内存区域。如果它在内存中,那么它不是编译器相关的问题。如果它不是编译器相关的,那么它可能是一些奇特的运行时库相关的问题。另一种可能的情况是您的输出设备(控制台或控制台模拟或其他)不支持您要输出的每个unicode字符,并且行为与预期的字符不同。 – pasztorpisti 2014-10-04 23:48:56

回答

1

由于@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"