宽字符字符串字面量

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"

【讨论】:

以上是关于宽字符字符串字面量的主要内容,如果未能解决你的问题,请参考以下文章

10.typescript-字符串字面量类型

模板字面量(模板字符串)

模板字面量(模板字符串)

ES6模板字面量

ES6模板字面量

用字符串字面量初始化非常量参数