我必须在char []中保存这封信 - 我无法做到。我试过这样做:
char example[1];
example[0] = 'ñ';
编译时我得到了这个:
$ gcc example.c
error: character too large for enclosing
character literal type
example[0] = 'ñ';
有谁知道怎么做?
答案 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\261
和0xC3
),你会看到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"};