在 cmd 中打印和存储西班牙语字符á、é、í、ñ...

问题描述

我正在使用带有 mingw-w64(gcc 版本 8.1.0,x86_64-posix-sjlj-rev0,由 MinGW-W64 项目构建)和 cmd 的 Microsoft Windows 10。当我尝试在 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 兼容性放在区域设置中:

enter image description here

但现在错误相反,打印出来的没问题,但是当我引入一个奇怪的字符时,控制台不显示它:

pía
lía
l

有点令人沮丧,因为我看到的所有解决方案都是通过上述方法或通过设置 setlocale() 解决的,但它们都不适合我,我不知道为什么。

编辑

正如 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() 设置 stdinstdout 以接收宽字符,然后使用 {{ 1}} 而不是 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 的长度如何而导致的实现问题基于编译器的 2 或 4 个字节。

,

正如 Mofi 在上面的评论中所说,解决方案在于我使用的编辑器如何解释我写的字符。我正在使用 Visual Studio Code 并更改默认情况下的编码,在右下角将 UTF-8 更改为 CP 850。现在编辑器将能够正确解释西班牙语字符。

下一个问题是更改控制台的代码页。使用命令 chcp 850 或函数 SetConsoleCP(850)SetConsoleOutputCP(850),我们可以更改我们打开的每个控制台上的代码页。要默认设置它,请执行以下操作:

  • 打开注册表编辑器并转到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
  • New -> String Value 并输入名称 Autorun
  • 将值修改为 chcp 850 > nul

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...