Setlocale不起作用

时间:2018-08-10 17:47:04

标签: c windows locale

我正在尝试使用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");输出以下内容:

  

áÃóõãÃ

2 个答案:

答案 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上都可以使用的程序之前,请不要担心。