如何在控制台中输出外来字符?

时间:2014-05-28 18:32:37

标签: c character-encoding console locale

如何使用C?

在屏幕上打印外国字符

这是我的代码,但不起作用:

#include <stdio.h>
#include <locale.h>

int main(){

    setlocale(LC_ALL,"Turkish"); 

    printf("İ ş ğ ü ö ı");

    system("pause");
    return 0;
}

4 个答案:

答案 0 :(得分:1)

在我的Windows上,终端中没有这样的字符&#39;字体。我想你不能打印它们 但我建议你自己检查这个字体。也许你有不同的版本。

答案 1 :(得分:1)

如果你正在使用单字节字符集,那么你需要确保终端/控制台正在使用相同的字符集,并且源代码文件在正确的编码,否则系统会误解字符代码。

首选方法应该是wprintf

输出Unicode字符

turkish chars

另请参阅WindowsLinuxMac

中的wprintf手册

如果您想直接通过程序而不是chcp更改输出,请使用SetConsoleOutputCP。关于在此网站上输出Unicode的问题已经有很多问题,例如Output unicode strings in Windows console appUTF-8 character in .NET Console Application。请看看哪个适合你。

SetConsoleOutputCP(CP_UTF8);SetConsoleOutputCP(65001);chcp 65001的结果相同,或者如果您确实需要Windows 1254,SetConsoleOutputCP(1254);。请记住将字体设置为Lucida Console或Consolas,默认光栅字体包含的字符数量有限。

修改

请注意,如果将字符串打印到文件中,则是要复制的字节流。并且该流只存储字符的代码点,它不显示任何内容。再次打开它时,编辑器的工作是处理正确的字符集中的字节以正确打印它。例如,字符'ğ'在UTF-8中存储为c4 9f,当以UTF-8打开文件时,编辑器知道它代表显示的字符“ğ”而不是猜测时的某些“垃圾”它作为一些错误的字符集。

有时UTF-8或UTF-16文本文件在开头嵌入了BOM,因此编辑器可以轻松识别它,但情况并非总是如此。由于There Ain't No Such Thing As Plain Text必须读取),编辑器必须猜测文件的编码,并且大部分时间它只是将文件视为ANSI,并使用当前的Windows代码页并赢得了字符如果Windows使用不同的代码页,则无法正确显示。在这种情况下,您需要指定charset。最简单的解决方案是将BOM嵌入到文件中。

答案 2 :(得分:0)

您的代码有效:http://ideone.com/K9hrv5

setlocale(LC_ALL,"Turkish");
printf("İ ş ğ ü ö ı");

唯一的问题是,在执行c程序的输出二进制文件之前,你必须set your terminal locale

设置终端区域设置:

enter image description here

答案 3 :(得分:0)

setlocale仅影响运行时区域设置。它不会使您的编译器支持额外的源文件字符。

您可能需要使用字符常量(例如\xF1表示代码为241的字符)来指定源文件中的非ASCII字符。