首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Setlocale不工作

Setlocale不工作
EN

Stack Overflow用户
提问于 2018-08-10 17:47:03
回答 2查看 3K关注 0票数 1

我尝试使用setlocale函数,以便在Windows中使用葡萄牙字符。

这是我的密码:

代码语言:javascript
复制
#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");输出如下:

圣保罗圣保罗圣保罗ƒ

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-10 19:35:28

首先,setlocale使用ISO 639-1语言代码,而不是英语语言的全名(加上允许您区分巴西语和欧洲葡萄牙语的后缀;完整的语法在MSDN中记录在“地区名称、语言和国家/区域字符串”下)。

其次,您得到的输出--带有一串重音字母Óáàóõãà --每个都成为以Ã开头的两个字符序列,这是UTF-8被误解为Windows-1252的一个典型的莫吉贝克模式。UTF-8是Unicode“编码点”的可变长度编码,在这种编码中,您试图使用的重音字符都变成了两个字节序列;Windows-1252是一个固定长度的编码,因此这两个字节对都被误解为两个字符。以下是这些特定字符的情况:

代码语言:javascript
复制
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的“宽字符”库通常更好。试一试这个程序:

代码语言:javascript
复制
#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上都能工作的程序之前,不要担心这一点。

票数 3
EN

Stack Overflow用户

发布于 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")解决了问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51791649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档