如何在 Windows 控制台上的 C 程序中使用希腊语 I/O

How to take I/O in Greek, in C program on Windows console

为了一个学校项目,我决定制作一个应用程序。我正在用 C 编写它,运行 它在 Windows 控制台上。我住在希腊,该程序也需要用希腊语读写文本。所以,我只是简单地尝试了

printf("Καλησπέρα");

但是它打印了一些随机字符。如何输出希腊字母?同样,我如何输入希腊语?

欢迎来到 Stack Overflow,感谢您提出如此有趣的问题!我希望您尝试做的事情很简单。但是您的编程语言 (C) 和您的执行环境(Windows 控制台)都是很久以前设计的,没有考虑希腊语。因此,将它们用于简单的学校项目并不容易。

当您的 C 程序通过 printf 将字节输出到标准输出时,Windows 控制台将这些字节解释为字符。它有一个默认解释,或 encoding,不包括希腊语。为了显示您的希腊字母,您需要告诉 Windows 控制台使用正确的编码。您可以使用 _setmode 调用和 _O_U16TEXT 参数来执行此操作。正如 Semih Artan 在评论中指出的那样,Windows _setmode documentation 中对此进行了描述。

_O_U16TEXT 模式意味着您的程序必须以 UTF-16 格式打印文本。每个字符长 16 位。这意味着您必须使用 L"\x039a" 等 C 语法将文本表示为宽字符。双引号前的 L 将字符串标记为具有“宽字符”,其中每个字符有 16 位而不是 8 位。字符串中的\x表示接下来的四个字符是十六进制数字,代表一个宽字符的16位。

您的 C 程序本身就是一个文本文件。 C 编译器必须根据字符解释此文本文件的字节。当以简单的方式使用时,编译器将只期望文件中的 ASCII 兼容字节值。这包括拉丁字母和数字,以及简单的标点符号。它不包括希腊字母。因此,您必须通过用 ASCII 替代品表示其字节来编写希腊文文本。

我相信,希腊字符 Καλησπέρα 在 C 宽字符语法中表示为 L"\x039a\x03b1\x03bb\x03b7\x03c3\x03c0\x03ad\x03c1\x03b1"

最后,Windows 控制台必须能够访问希腊字体才能显示希腊字符。我希望这对您来说不是问题,因为您的计算机可能已经 运行 希腊语了。在任何情况下 Windows 全球范围内包括覆盖希腊语的字体。

将此希腊文本插入 Microsoft _setmode 文档中的示例程序即可。 (注意:我没有亲自测试过这个程序。)

#include <fcntl.h>
#include <io.h>
#include <stdio.h>

int main(void) {
    _setmode(_fileno(stdout), _O_U16TEXT);
    wprintf(L"\x039a\x03b1\x03bb\x03b7\x03c3\x03c0\x03ad\x03c1\x03b1\n");
    return 0;
}  

输入是另一回事。我不会尝试在这里通过它。您可能必须将 stdin 的模式设置为 _O_U16TEXT。然后字符将显示为 UTF-16。您可能需要先转换它们才能对您的程序有用。

总的来说,要为一个读写希腊语的学校项目编写一个简单的应用程序,我建议您考虑使用像 Visual Studio 这样的工具来编写一个 GUI 程序。这些工具具有更现代的设计,让您可以更轻松地访问包含希腊字母的文本。