在我的系统上,一个非常普通的 Ubuntu 13.10,尽管 LC_ 环境变量被设置为 en_US.UTF-8,但无论我使用什么工具,法语重音字符“éèàçù...”总是能正确处理。 特别是 grep、cat 等命令行实用程序,...总是可以顺利读取和打印这些字符。
尽管有这些评论,像这样的小程序
int main() {
printf("%c", getchar());
return 0;
}
当用户输入“é”时失败。
从手册页和大量谷歌搜索中,没有标准的方法来关闭标准输出,然后重新打开它。从 man fwide() 开始,如果 stdout 处于字节模式,我无法将它传递到宽字符模式,除非关闭它并重新打开它……因此我不能使用 getwchar() 和 wprintf()。
我不敢相信每一个实用程序,如 cat、grep 等...都重新实现了一种管理宽字符的方法,但根据我的研究,我看不到其他方法。
是我的系统有问题吗?我看不出每个实用程序如何完美运行。 请问我错过了什么?
最佳答案
当 C 程序启动时,stdout
、stdin
和 stderr
既不是面向字节的,也不是面向宽字符的。 fwide(stdin, 0)
此时应返回 0。
如果您将最小程序扩展为:
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main()
{
setlocale(LC_ALL, "");
printf("%lc\n", getwchar());
return 0;
}
那么它应该会如您所愿地工作。 (这里不需要显式设置 stdin
的方向 - 因为它的第一个操作是宽字符操作,所以它将具有宽字符方向)。
您确实需要使用getwchar()
而不是getchar()
,但是如果您想用它读取宽字符。
关于c - 无法将标准输出置于宽字符模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19955395/