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

Posted

技术标签:

【中文标题】如何在 Windows 控制台上的 C 程序中用希腊语进行 I/O【英文标题】:How to take I/O in Greek, in C program on Windows console 【发布时间】:2022-01-18 20:22:58 【问题描述】:

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

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

但它会打印一些随机字符。如何输出希腊字母?同样,我怎样才能接受希腊语输入?

【问题讨论】:

看这个链接:docs.microsoft.com/en-us/cpp/c-runtime-library/reference/… 您的示例 printf("Καλησπέρα"); 将工作如果您的 C 编译器和您的显示环境同意使用哪种编码(UTF-8、UTF-16 等) Unicode 字符。您可能还需要将#include <locale.h>setlocale(LC_CTYPE, ""); 行添加到您的程序中。另见utf8everywhere.org。 @Steve Summit 谢谢。有空我会试试的 我实现了Modern C一书中提出的解决方案,类似于@Steve 提出的解决方案。它适用于我的 Linux 环境,而不是我的 Windows one ... 在 Windows 上,当你使用 C Runtime 以 Unicode 打印文本时,你应该通过调用 _setmode 将输出模式切换为 Unicode,第一个参数设置为 sdtout 的文件描述符,第二个参数设置为设置为 _O_U16TEXT。 【参考方案1】:

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

当您的 C 程序通过 printf 将字节输出到标准输出时,Windows 控制台会将这些字节解释为字符。它有一个默认解释,或编码,不包括希腊语。为了让您的希腊字母出现,您需要告诉 Windows 控制台使用正确的编码。您可以使用_setmode 调用和_O_U16TEXT 参数来执行此操作。正如 Semih Artan 在 cmets 中指出的那样,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 程序。这些工具具有更现代的设计,让您更轻松地访问带有希腊字母的文本。

【讨论】:

感谢您的回答!我认为使用 _setmode 会很好,但有 2 个问题: 1. 我需要将文本实现为 ASCII 字符吗?这会有点困难,需要一些时间和 2。我很想使用 VS,但我只知道一些基本的 C 和 VS 不(可悲)不支持 C ......或者是吗?提前致谢 问:“我需要将文本实现为 ASCII 字符吗?”答:是的。正如我在答案中所说,“......编译器将只期望文件中与 ASCII 兼容的字节值......因此,您必须通过用 ASCII 替代品表示其字节来编写希腊文本。” 问:“VS 不(遗憾地)不支持 C ......还是支持?”答:这是一个不同的问题。看起来您是 Stack Overflow 的新手。需要了解的一件事是,这些 cmets 不用于讨论和后续问题。将有关 Visual Studio 的问题作为一个单独的问题提出,并让它得到单独的答案。知识更清晰,更容易找到这种方式。另外,您可以获得更多的声望点。我不会尝试回答本次讨论中的后续问题。 另一个在 Stack Overflow 上成功的提示:如果这是您问题的正确答案,请点击答案左侧的“复选”标记 (✔️) 接受它。如果此答案有帮助,请单击向上的三角形进行投票。支持和接受有用的答案使其他读者更容易看到它们。 (这也给了我,作为答案作者,更多的积分。) 是的...我是新人...我知道正如我们在希腊所说的那样“需要注意”(这意味着很明显)!无论如何,谢谢你的回答!

以上是关于如何在 Windows 控制台上的 C 程序中用希腊语进行 I/O的主要内容,如果未能解决你的问题,请参考以下文章

在 C 编程中用空格读取行并分割单词

Windows 控制台上的 UTF-8 输出

C 程序在控制台上短暂显示,然后消失

Windows MINGW64控制台上的Python3.6不运行解释器[重复]

控制台上的陷阱退出

如何从 Cygwin 在 Jenkins 控制台上显示 bash 脚本执行