在 cmd 中打印和存储西班牙字符(á、é、í、ñ...)
Print and store spanish characters (á, é, í, ñ...) in cmd
我正在使用 Microsoft Windows 10 和 mingw-w64(gcc 版本 8.1.0,x86_64-posix-sjlj-rev0,由 MinGW-W64 项目构建)和 cmd
。当我尝试在 Windows 控制台上打印或存储然后打印西班牙字符时,它显示错误。例如我试图执行这个程序:
#include <stdio.h>
int main(void) {
char c[20];
printf("pía\n");
scanf("%s", c);
printf("%s", c);
}
如果我引入一些西班牙字符,返回的句子没问题,但开头打印的句子显示错误:
pía
laíóñaú
laíóñaú
有些解决方案建议使用 setlocale()
函数,但结果是一样的。其他解决方案是将 UTF-8 unicode 兼容性放在区域设置中:
但是现在错误相反,打印的是可以的,但是当我引入一个st运行ge字符时,控制台没有显示:
pía
lía
l
这有点令人沮丧,因为我看到的所有解决方案都是通过上述方法或通过设置 setlocale()
解决的,但是其中 none 对我有效,我不知道为什么。
编辑
正如 Mofi 在评论中所说,我尝试使用 SetConsoleCP()
和 SetConsoleOutputCP()
来更改控制台的代码页。在没有完全理解这些函数是如何工作的情况下,使用与上面相同的代码,我 运行 几个结果错误的例子:
pía | p├¡a | p├¡a | pía
lía | lía | lía | lía
l | l | lía | la
input: 65001 output 65001 | input: 65001 output 850 | input: 850 output 850 | input: 850 output 65001
我怎么不完全理解这个函数我不知道为什么在最后一个例子中,控制台不显示重音存储的字符,但在打印的字符中却显示,而在上面的例子中恰恰相反.
我玩了一会儿,唯一有用的是使用 _setmode()
设置 stdin
和 stdout
接受宽字符,然后使用wchar_t
而不是 char
来存储文本。此代码在我的机器上按预期工作:
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main(void) {
_setmode(_fileno(stdin), _O_WTEXT);
_setmode(_fileno(stdout), _O_WTEXT);
wchar_t c[20];
wprintf(L"pía\n");
wscanf(L"%ls", c);
wprintf(L"%ls", c);
}
已编辑: 我将 _setmode
的参数从 _O_U16TEXT
更改为 _O_WTEXT
以避免因 wchar_t
是 2 个或 4 个字节,具体取决于编译器。
正如 Mofi 在上面的评论中所说,解决方案在于我使用的编辑器如何解释我编写的字符。我使用的是 Visual Studio 代码并更改默认的编码,在右下角将 UTF-8
更改为 CP 850
。现在编辑器将能够正确解释西班牙字符。
下一个问题是更改控制台的代码页。使用命令 chcp 850
或函数 SetConsoleCP(850)
和 SetConsoleOutputCP(850)
我们可以更改我们打开的每个控制台上的代码页。要默认设置它,请执行以下操作:
- 打开注册表编辑器并转到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
。
New
-> String Value
并输入名称 Autorun
.
- 将值修改为
chcp 850 > nul
。
我正在使用 Microsoft Windows 10 和 mingw-w64(gcc 版本 8.1.0,x86_64-posix-sjlj-rev0,由 MinGW-W64 项目构建)和 cmd
。当我尝试在 Windows 控制台上打印或存储然后打印西班牙字符时,它显示错误。例如我试图执行这个程序:
#include <stdio.h>
int main(void) {
char c[20];
printf("pía\n");
scanf("%s", c);
printf("%s", c);
}
如果我引入一些西班牙字符,返回的句子没问题,但开头打印的句子显示错误:
pía
laíóñaú
laíóñaú
有些解决方案建议使用 setlocale()
函数,但结果是一样的。其他解决方案是将 UTF-8 unicode 兼容性放在区域设置中:
但是现在错误相反,打印的是可以的,但是当我引入一个st运行ge字符时,控制台没有显示:
pía
lía
l
这有点令人沮丧,因为我看到的所有解决方案都是通过上述方法或通过设置 setlocale()
解决的,但是其中 none 对我有效,我不知道为什么。
编辑
正如 Mofi 在评论中所说,我尝试使用 SetConsoleCP()
和 SetConsoleOutputCP()
来更改控制台的代码页。在没有完全理解这些函数是如何工作的情况下,使用与上面相同的代码,我 运行 几个结果错误的例子:
pía | p├¡a | p├¡a | pía
lía | lía | lía | lía
l | l | lía | la
input: 65001 output 65001 | input: 65001 output 850 | input: 850 output 850 | input: 850 output 65001
我怎么不完全理解这个函数我不知道为什么在最后一个例子中,控制台不显示重音存储的字符,但在打印的字符中却显示,而在上面的例子中恰恰相反.
我玩了一会儿,唯一有用的是使用 _setmode()
设置 stdin
和 stdout
接受宽字符,然后使用wchar_t
而不是 char
来存储文本。此代码在我的机器上按预期工作:
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main(void) {
_setmode(_fileno(stdin), _O_WTEXT);
_setmode(_fileno(stdout), _O_WTEXT);
wchar_t c[20];
wprintf(L"pía\n");
wscanf(L"%ls", c);
wprintf(L"%ls", c);
}
已编辑: 我将 _setmode
的参数从 _O_U16TEXT
更改为 _O_WTEXT
以避免因 wchar_t
是 2 个或 4 个字节,具体取决于编译器。
正如 Mofi 在上面的评论中所说,解决方案在于我使用的编辑器如何解释我编写的字符。我使用的是 Visual Studio 代码并更改默认的编码,在右下角将 UTF-8
更改为 CP 850
。现在编辑器将能够正确解释西班牙字符。
下一个问题是更改控制台的代码页。使用命令 chcp 850
或函数 SetConsoleCP(850)
和 SetConsoleOutputCP(850)
我们可以更改我们打开的每个控制台上的代码页。要默认设置它,请执行以下操作:
- 打开注册表编辑器并转到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
。 New
->String Value
并输入名称Autorun
.- 将值修改为
chcp 850 > nul
。