在C中使用字母ñ

时间:2018-03-24 22:52:48

标签: c

我必须在char []中保存这封信 - 我无法做到。我试过这样做:

char example[1];
example[0] = 'ñ';

编译时我得到了这个:

$ gcc example.c
error: character too large for enclosing
  character literal type
    example[0] = 'ñ';

有谁知道怎么做?

3 个答案:

答案 0 :(得分:4)

如果你正在使用High Sierra,你可能会使用运行macOS 10.13.3(High Sierra)的Mac,就像我一样。

这归结为代码集和语言环境 - 并且可能变得棘手。 Mac终端默认使用UTF-8,ñ是Unicode字符U + 00F1,需要两个字节0xC3和0xB1来表示UTF-8。编译器让你知道一个字节不足以容纳两个字节的数据。 (在ISO 8859-1或8859-15等单字节代码集中,ñ有字符代码0xF1 - 0xF1和U + 00F1类似,这不是巧合; Unicode代码指向U + 0000到U + 00FF与ISO 8859-1中的相同.ISO 8859-15是8859-1的更现代的变体,欧元符号€和8859-1的7个其他变体。)

另一种选择是更改终端使用的字符集;您需要调整代码以适应终端使用的代码集。

您可以使用wchar_t

解决此问题
#include <wchar.h>

void function(void);

void function(void)
{
    wchar_t example[1];
    example[0] = L'ñ';
    putwchar(example[0]);
    putwchar(L'\n');
}

#include <locale.h>

int main(void)
{
    setlocale(LC_ALL, "");
    function();
    return 0;
}

这编译;如果省略对setlocale(LC_ALL, "");的调用,它将无法正常工作(它只生成八进制字节\361(又名0xF1)和换行符,生成{{1}在终端上),而对于?,它会生成两个字节(八进制setlocale(),又名\303\2610xC3),你会看到0xB1控制台输出。

答案 1 :(得分:2)

您可以使用“extended ascii”。这个chart表明'ñ'可以用扩展的ascii表示为164。

example[0] = (char)164;

您可以像任何其他角色一样打印此角色

putchar(example[0]);

如上面的评论所述,这取决于您的环境。它可能适用于您的计算机但不适用于其他计算机。

更好的答案是使用unicode,例如:

wchar_t example = '\u00F1';

答案 2 :(得分:1)

这实际上取决于您将使用的字符集/区域设置。如果你想将它硬编码为latin1字符,这个示例程序会这样做:

#include <cstdio>

int main() {
    char example[2] = {'\xF1'};
    printf("%s", example);
    return 0;
}

然而,这会导致我的系统上的输出使用UTF-8:

$ ./a.out 
�

因此,如果您想使用非ascii字符串,我建议不要直接将它们表示为char数组。如果确实需要直接使用char,ñ的UTF-8序列是两个字符宽,并且可以这样写(再次使用终止&#39; \ 0&# 39;好的衡量标准):

char s[3] = {"\xC3\xB1"};