【发布时间】:2016-05-22 09:52:50
【问题描述】:
运行以下内容时:
char acute_accent[7] = "éclair";
int i;
for (i=0; i<7; ++i)
{
printf("acute_accent[%d]: %c\n", i, acute_accent[i]);
}
我明白了:
acute_accent[0]:
acute_accent[1]: �
acute_accent[2]: c
acute_accent[3]: l
acute_accent[4]: a
acute_accent[5]: i
acute_accent[6]: r
这让我觉得多字节字符 é 是 2 字节宽。
但是,在运行此程序时(在忽略来自multi-character character constant 的编译器警告我之后):
printf("size: %lu",sizeof('é'));
我收到size: 4。
大小不一的原因是什么?
编辑:这个问题与this 不同,因为它更多的是关于多字节字符编码、不同的 UTF 及其大小,而不是仅仅了解 char 的大小。
【问题讨论】:
-
'引号中的常量属于int类型。不要忽视警告。 -
什么平台?在 Windows 上,您可以使用 UCS-2
wchar_t,但您仍然面临复合代码点和代理对的缓冲区溢出风险。您还应该指定字符串的编码,否则实现未定义:u8"éclair";。可能重复:stackoverflow.com/questions/2172943 -
"在忽略编译器警告之后" - 这已经足够了。如果你不完全理解为什么编译器会发出警告,你不应该忽略它。
-
@EugeneSh。和奥拉夫,吸取教训,谢谢。