c - fgets 没有使用设置的语言环境

标签 c locale fgets setlocale

考虑以下代码:

#include <stdio.h>
#include <locale.h>

int main()
{
    char test[100];

    printf("WITHOUT LOCALE: á, é, í, ó, ú, ü, ñ, ¿, ¡\n");

    setlocale(LC_CTYPE, "Spanish");

    printf("WITH LOCALE: á, é, í, ó, ú, ü, ñ, ¿, ¡\n");

    fgets(test, 100, stdin);

    printf("WITH FGETS AND LOCALE: %s\n", test);
    return 0;

}

以及 fgets 的以下输入:

á, é, í, ó, ú, ü, ñ, ¿, ¡

我希望它能够根据预先设置的语言环境支持特殊字符。然而,这是输出:

WITHOUT LOCALE: ß, Ú, Ý, ¾, ·, ³, ±, ┐, í
WITH LOCALE: á, é, í, ó, ú, ü, ñ, ¿, ¡
WITH FGETS AND LOCALE:  , ', ¡, ¢, £, ?, ¤, ¨, ­

知道会发生什么吗?

最佳答案

由于我在朝九晚五的工作中反复遇到这样的问题,所以我想出了一个 side-by-side table of common 8-bit encodings .

使用该表,似乎:

  • 您的编辑器将源代码保存在 CP-1252 中(例如 'ó' -> 0xf3)
  • 第一行输出是解释为 (DOS) CP-850 (0xf3 -> '¾') 的字节,
  • 第二行(setlocale()之后)为CP-1252编码(0xf3 -> 'ó'),
  • 第三行是CP-850中读取的输入,显示为CP-1252('ó' -> 0xa2 -> '¢').

(我假设是 Windows 平台——CP-1252——因为非 Windows 平台不会提供 CP-850,除非被迫在 Guzzle 下。源编码也可以是 ISO 8859-1/西欧,或者ISO 8859-9/土耳其语,无法用给定的字符集区分。它不可能是 ISO 8859-15,因为那样会将 'ñ' 变成 '€',而不是 '¤'。它不能是任何其他 ISO 8859 编码,因为只有 -1、-9 和 -15 将 '¿' 转换为 '┐'.)

请注意,C 源代码中非 ASCII-7 字符的解释是实现定义的,因此您必须确保您的编辑器、终端(如果有)和编译器就使用的编码达成一致。如果可能的话,将您的环境设置为始终使用 Unicode(UTF-8 是最实用的),以避免出现此类问题。我还建议对源代码中的任何非 ASCII-7 使用八进制转义符,因为您不知道其他人在将源代码提供给他们的编辑器/编译器时会使用什么编码设置。

关于c - fgets 没有使用设置的语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47530908/

相关文章:

c - 在 C 中引用未初始化的变量

c - 如何使用 select 从 stdin 读取输入?

c - fgets 如何从文件中逐行读取?

ruby-on-rails - 在 Rails 中,如何在 i18n 语言环境文件中指定默认 flash 消息

c - 控制台读取错误

c - 下载GTK之后,为什么我的编译器给我这些错误?

c++ - 在 C/C++(ms) 中将 char[] 转换为 tchar[] 的最简单方法是什么?

c++ - createprocess 没有那个文件或目录

python - IPython 中输入编码的奇怪问题

java - 对包含非西方字符的字符串进行排序