我尝试使用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 ao计算器模拟器2018 -FOS圣保罗“RIO版”
用cmd编写的所有其他文本都会正确显示,只有我的程序输出有此问题。
看起来任何不同的字符都被更改为“圣保罗”加上另一个随机字符。例如:printf("áàóõãÃ\n");输出如下:
圣保罗圣保罗圣保罗ƒ
发布于 2018-08-10 19:35:28
首先,setlocale使用ISO 639-1语言代码,而不是英语语言的全名(加上允许您区分巴西语和欧洲葡萄牙语的后缀;完整的语法在MSDN中记录在“地区名称、语言和国家/区域字符串”下)。
其次,您得到的输出--带有一串重音字母Óáàóõãà --每个都成为以Ã开头的两个字符序列,这是UTF-8被误解为Windows-1252的一个典型的莫吉贝克模式。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内部几乎所有东西都使用乌特夫-16,这意味着使用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");
}注意:大多数其他操作系统比Windows更慢于Unicode,只有在UTF-8比UTF-16更好的选择之后,才开始使用它,这意味着除Windows以外的所有操作系统都应避免使用“宽字符”库。在您需要编写一个在Windows和非Windows上都能工作的程序之前,不要担心这一点。
发布于 2021-03-24 11:41:55
我在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")解决了问题。
https://stackoverflow.com/questions/51791649
复制相似问题