考虑以下代码:
#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/