一旦我编写了ac程序并尝试在Windows 10的cmd窗口上输出printf()的特殊字符(如äöüß),它只显示像▒▒▒▒▒▒▒▒▒▒▒▒< / p>
但是,如果我只是在没有执行c程序的cmd窗口中键入它们,它会正确显示这些字符。 当我在netbeans中将控制台类型更改为标准输出时,输出也是正确的。 我试图更改cmd的代码页,但它没有解决问题。 我使用gcc c编译器。
答案 0 :(得分:2)
这是处理printf的方式,默认情况下printf 仅打印ascii字符,如a,a&#39; s,这里是维基百科文章的链接{ {3}},要打印其他语言的特殊字符/字符,请使用此选项,将您的字符串替换为您要打印的文字
printf(L"your string");
简而言之,在字符串前添加前缀L,大写字母L以打印特殊字符。
希望它能帮助mukund2003
答案 1 :(得分:2)
原因是使用不同的代码页进行字符编码。
在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
,可以看到控制台窗口中默认使用的代码页。 / p>
用户帐户的计算机上的GUI应用程序和控制台应用程序的默认代码页取决于此用户帐户的Windows区域和语言设置。
您应该阅读一些网页以更好地理解字符编码:
程序员不应该将非ASCII个字符写入由编译的可执行文件输出的字符串中,因为它取决于编译器在创建可执行文件中字符的二进制表示(字节)时使用的代码页。在输出字符串之前,当应用程序执行应用程序的活动代码页时,最好使用十六进制表示法。
还可以在Unicode中将字符串存储在可执行文件中,在输出任何字符串之前确定输出句柄的编码,并在将字符串写入输出句柄之前将每个Unicode字符串转换为输出句柄的编码。 / p>
当然,这取决于使用的输出字体,可执行文件中字符串中的字节最终是如何真正显示在屏幕上的。