c - 无法将标准输出置于宽字符模式

标签 c linux widechar

在我的系统上,一个非常普通的 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 程序启动时,stdoutstdinstderr 既不是面向字节的,也不是面向宽字符的。 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/

相关文章:

c - C中的八进制到十进制

c - 为什么 strtok 导致段错误?

linux - 以文字模式从另一个脚本编写 bash 脚本

python - M2Crypto 没有安装在 venv 中,或者 swig 没有定义 __x86_64__ 这会破坏针对 OpenSSL 的编译

delphi - Delphi 中不兼容的 char 和 widechar

c++: printf 和 wprintf 不能一起工作 (linux)

C访问结构中的结构

c++ - 将 unsigned long long int 转换为 signed long long int 可能吗?

linux - sed 在文件中搜索带有特殊字符的字符串

C++ 模板和字符串文字