我正在用C写一个程序,当我在cmd.exe中运行它时,我希望在菜单中有希腊字符。 有人说,为了包含希腊字符,你必须使用一个printf
,像这样:
printf(charset:IS0-1089:uffe);
但他们不确定。
有谁知道这是怎么做到的吗?
假设Windows,您可以:
此代码打印γειά σου
:
#include "windows.h" int main() { SetConsoleOutputCP(1253); //"ANSI" Greek printf("\xE3\xE5\xE9\xDC \xF3\xEF\xF5"); return 0; }
十六进制代码表示编码为windows-1253时的γειά σου
。 如果使用编辑器将数据保存为windows-1253,则可以使用文字。 另一种方法是使用OEM 737 (实际上是DOS编码)或使用Unicode。
我使用SetConsoleOutputCP
来设置控制台代码页,但是可以在运行程序之前键入命令chcp 1253
。
你可以使用printf
打印一个unicode字符:
printf("\u0220\n");
这将打印Ƞ
我认为这可能只适用于你的控制台支持希腊语。 可能你想要做的是将字符映射到希腊语,但使用ASCII。 对于C#,但在C中有相同的想法
913到936 =大写的希腊字母
945到968 =小写希腊字母
阅读更多在Suite101:使用希腊字母和C#:如何正确显示ASCII代码创建C#应用程序| Suite101.com在这个链接 。
一种方法是打印一个宽字符串。 不幸的是,Windows需要一些非标准的设置来完成这个工作。 这段代码在#if
块内部完成了这个设置。
#include <locale.h> #include <stdlib.h> #include <stdio.h> #include <wchar.h> /* This has been reported not to autodetect correctly on tdm-gcc. */ #ifndef MS_STDLIB_BUGS // Allow overriding the autodetection. # if ( _WIN32 || _WIN64 ) # define MS_STDLIB_BUGS 1 # else # define MS_STDLIB_BUGS 0 # endif #endif #if MS_STDLIB_BUGS # include <io.h> # include <fcntl.h> #endif void init_locale(void) // Does magic so that wprintf() can work. { // Constant for fwide(). static const int wide_oriented = 1; #if MS_STDLIB_BUGS // Windows needs a little non-standard magic. static const char locale_name[] = ".1200"; _setmode( _fileno(stdout), _O_WTEXT ); #else // The correct locale name may vary by OS, eg, "en_US.utf8". static const char locale_name[] = ""; #endif setlocale( LC_ALL, locale_name ); fwide( stdout, wide_oriented ); } int main(void) { init_locale(); wprintf(L"μουσάων Ἑλικωνιάδων ἀρχώμεθ᾽\n"); return EXIT_SUCCESS; }
必须将其保存为带有BOM的UTF-8,以便旧版本的Visual Studio正确读取它。 您的控制台也必须设置为等宽字体统一字体,如Lucida控制台,以正确显示它。 为了在ASCII字符串中混合宽字符串,标准将%ls
和%lc
格式说明符定义为printf()
,尽管我发现这些方法在任何地方都行不通。
另一种方法是将控制台设置为UTF-8模式(在Windows上,使用chcp 65001
进行此操作),然后使用printf(u8"μουσάων Ἑλικωνιάδων ἀρχώμεθ᾽\n");
打印UTF-8字符串printf(u8"μουσάων Ἑλικωνιάδων ἀρχώμεθ᾽\n");
。 UTF-8是Windows上的二等公民,但通常是有效的。 尝试运行,而不先设置代码页,但是,你会得到垃圾。