C 宽字符字符串文字

C 宽字符字符串文字,c,wchar-t,C,Wchar T,我在Windows上使用MinGW GCC编译器时遇到了宽字符串文本的问题 当我使用wscanf读取用户输入时,wprintf输出正确的国家字符。但是,宽字符串文字在第一个国家字符处停止输出: wprintf (L"China - Čína"); // outputs "China - " 假设wchar\u t默认编码为UTF-16(是LE还是BE?),那么当源是UTF-8文件时,它是如何工作的?我试图将源代码保存为UTF-16,但我得到了非法的字节序列错误。正如@pasztorpisti建

我在Windows上使用MinGW GCC编译器时遇到了宽字符串文本的问题

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

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

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

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

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

仔细阅读非常有用:我使用
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"

源代码的编码与程序运行时使用的编码无关。您的源代码可以采用您想要的任何编码,只要编译器知道它是什么,这样它就可以将您的字符串文本翻译成运行时字符集。包括
,然后调用
setlocale(LC_ALL,“sk”)(或
“cz”
,或“Čna”中的任何一种语言)在
wprintf
行之前,应该正确显示您放置的文本。然而,事实并非如此。我没能用上下颠倒的扬抑音打印“Č”。抱歉…请使用调试器中的内存视图检查保存字符串的内存区域。如果它在内存中,那么它就不是与编译器相关的问题。如果它与编译器无关,那么它可能是一些奇特的运行时库相关问题。另一种可能的情况是,您的输出设备(控制台或控制台模拟或其他)不支持您要输出的所有unicode字符,并且其行为与您在使用花式字符时预期的行为不同。@pasztorpisti非常感谢,我找到了答案,请参阅我的答案