宽字符字符串字面量
Posted
技术标签:
【中文标题】宽字符字符串字面量【英文标题】:Wide characters string literal 【发布时间】:2014-11-29 14:41:21 【问题描述】:我在 Windows 上使用 MinGW GCC 编译器时遇到宽字符串文字问题。
当我使用wscanf
读取用户输入时,wprintf
输出正确的国家字符。然而,宽字符串文字会在第一个国家字符处停止输出:
wprintf (L"China - Čína"); // outputs "China - "
假设 wchar_t 默认编码为 UTF-16(是 LE 还是 BE?),当源是 UTF-8 文件时它是如何工作的?我尝试将源代码另存为 UTF-16,但出现 illegal byte sequence 错误。
【问题讨论】:
你源代码的编码与程序运行时使用的编码无关。你的源代码可以是你想要的任何编码,只要编译器知道它是什么,以便它可以将你的字符串文字翻译成运行时字符集。 包括<locale.h>
,然后在wprintf
行之前调用setlocale(LC_ALL, "sk");
(或"cz"
,或任何一种语言“Čína”),应该正确显示你放的文字。然而,事实并非如此。我无法用颠倒的抑扬符打印“Č”。对不起...
使用调试器中的内存视图检查保存字符串的内存区域。如果它在内存中,那么它不是与编译器相关的问题。如果它与编译器无关,那么它可能是一些花哨的运行时库相关问题。另一种可能的情况是您的输出设备(控制台或控制台仿真或其他)不支持您想要输出的每个 unicode 字符,并且在花哨的字符情况下的行为与您预期的不同。
@pasztorpisti 非常感谢,我想通了,看看我的回答
【参考方案1】:
正如@pasztorpisti 建议的那样,我尝试了内存查看器,子字符串Čína 存储为0C 01 ED 00 6E 00 61 00
,这在UTF-16LE 中是正确的。
我的控制台使用 CP852 作为默认代码页,所以我尝试了chcp 1200
,但没有设置! MSDN says 仅适用于托管应用程序 - Microsoft 知道如何创建编码地狱。
仔细阅读this answer非常有用:我使用WriteConsoleW
在残缺的控制台中生成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"
【讨论】:
以上是关于宽字符字符串字面量的主要内容,如果未能解决你的问题,请参考以下文章