我正在尝试使用setlocale
函数,以便可以在Windows控制台中使用葡萄牙语字符。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL, "Portuguese");
printf("Bem-Vindo ao CALCULADORA SIMULATOR 2018 - FOSÓRIO EDITION\n");
}
但这是我的输出:
Bem-Vindo ao CALCULADORA SIMULATOR 2018-福斯里奥版
用cmd编写的所有其他文本都可以正确显示,只有我程序的输出有此问题。
并且看起来任何其他字符都将更改为“Ô,再加上另一个随机字符。例如:printf("áàóõãÃ\n");
输出以下内容:
áÃóõãÃ
答案 0 :(得分:3)
我在 windows 中遇到了同样的问题,更改 chcp(850、860 和 1252)后问题仍然存在。
所以我尝试使用 wprintf 但这也不起作用。
当我在 Settings > Time & Language > Language > Administrative Language Settings > Change System Local > and here select the BETA Unicod UTF-8
中进行更改并单击“确定”按钮时,我才设法让它工作。重新启动计算机后,printf("áàóõãÃ\n")
的问题就解决了。
答案 1 :(得分:0)
首先,setlocale
接受ISO 639-1语言代码,而不是英语的语言全名(加上后缀,例如,您可以将巴西语与欧洲葡萄牙语区分开;完整的语法记录在MSDN中在“ Locale Names, Languages, and Country/Region Strings下”。
第二,您得到的输出带有一串重音字母ÓáàóõãÃ
,每个字母由Ã
变成两个字符,是{{3}的特征mojibake模式}被误解为UTF-8。 UTF-8是Unicode“代码点”的变长编码,其中您要尝试使用的重音字符变成两个字节的序列; Windows-1252是固定长度的编码,因此这些对字节中的每对都被误解为两个字符。这些特定字符的处理过程如下:
character codepoint UTF-8 two-byte sequence Windows-1252
--------- --------- ----------------------- ------------
Ó U+00D3 0xC3 0x93 Ã “
á U+00E1 0xC3 0xA1 Ã ¡
à U+00E0 0xC3 0xA0 Ã □
ó U+00F3 0xC3 0xB3 Ã ³
õ U+00F5 0xC3 0xB5 Ã µ
ã U+00E3 0xC3 0xA3 Ã £
à U+00C3 0xC3 0x83 à ƒ
(à
行上的白色正方形代表一个不间断的空格)
这是Windows控制台破坏“窄”文本输出的典型方法。 Windows内部几乎所有内容都使用Windows-1252,这意味着使用C的“宽字符”库通常效果更好。请尝试以下程序:
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "pt"); // also try "pt_BR"
wprintf(L"Bem-Vindo ao CALCULADORA SIMULATOR 2018 - FOSÓRIO EDITION\n");
}
注意:大多数其他操作系统的Unicode降级速度都比Windows慢,只有在很明显UTF-8比UTF-16更好的选择(这意味着“宽字符”)后才采用Unicode。在Windows以外的所有操作系统上,应避免使用该库。在您需要编写可在Windows和非Windows上都可以使用的程序之前,请不要担心。