一旦我编写了一个 c 程序并尝试在 Windows 10 的 cmd 窗口中使用 printf() 输出特殊字符(如 ä ö ü ß),它只显示像 ▒▒▒▒▒▒▒▒▒▒▒▒
但是如果我只是在 cmd 窗口中键入它们而没有执行 c 程序,它会正确显示这些字符。 当我在 netbeans 中将控制台类型更改为标准输出时,输出也是正确的。 我试图更改 cmd 的代码页,但没有解决问题。 我使用 gcc c 编译器。
最佳答案
原因是字符编码使用了不同的代码页。
在 GUI 文本编辑器中编写存储在文件中的程序代码,其中每个字符仅用一个字节编码代码页 Windows-1252用于西欧和北美国家。
在运行控制台应用程序时打开的控制台窗口中,使用了西欧国家/地区的 OEM 代码页 OEM 850和北美国家OEM 437 .
因此,您需要在代码中编写 ÄÖÜäöüß
不同的字节值,以使这些字符至少在西欧和北美国家/地区执行时按预期显示在控制台窗口中。
Character Windows-1252 OEM 850
Ä \xC4 \x8E
Ö \xD6 \x99
Ü \xDC \x9A
ä \xE4 \x84
ö \xF6 \x94
ü \xF1 \x8C
ß \xDF \xE1
可以通过打开命令提示符窗口并运行 chcp
(更改代码页)或 mode
来查看控制台窗口中默认使用的代码页事件代码页。
用户帐户计算机上 GUI 应用程序和控制台应用程序的默认代码页取决于该用户帐户的 Windows 区域和语言设置。
您应该阅读一些网页以更好地理解字符编码:
- Character encoding (英文维基百科文章)
- On the Goodness of Unicode通过蒂姆·布雷
- The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)通过乔尔Spolksy
- What's the best default new file format? (UltraEdit 论坛主题)
程序员不应该写非ASCII字符转换为已编译可执行文件输出的字符串,因为它取决于编译器在创建可执行文件中字符的二进制表示(字节)时使用的代码页。如果在输出字符串之前应用程序执行的事件代码页已知或由应用程序定义,则最好使用十六进制表示法。
也可以将字符串存储在 Unicode 的可执行文件中,在输出任何字符串之前确定输出句柄的编码,并在将字符串写入输出句柄之前将每个 Unicode 字符串转换为输出句柄的编码。
当然,这取决于使用的输出字体,可执行文件中字符串中的字节最终如何真正显示在屏幕上。
关于c - 如何在cmd窗口输出特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40444151/