我的操作系统是Debian,我的默认语言环境是UTF-8,我的编译器是gcc。默认情况下,limits.h中的CHAR_BIT为8,这对于ASCII是可以的,因为在ASCII 1 char = 8位。但由于我使用的是UTF-8,因此字符最多可以为32位,这与CHAR_BIT的默认值8相矛盾。
如果我在limits.h中将CHAR_BIT修改为32以更好地适应UTF-8,那么为了使这个新值生效,我该怎么做?我想我必须重新编译gcc?我是否必须重新编译linux内核?那些默认安装的Debian软件包会起作用吗?
答案 0 :(得分:4)
CHAR_BIT
是char
中的位数;永远不会改变这一点。它不会产生你想要的效果。
相反,使用UTF-8编码的char
字符串,或者如果要直接存储Unicode字符,请使用wchar_t
字符串。*
*小字体:wchar_t
的大小也与系统有关。在具有MSVC的Windows上,它只有16位,仅对基本多语言平面足够。但是,您可以将它与UTF-16一起使用,它可以与Windows API一起使用。在大多数其他系统上,wchar_t
为您提供完整的32位。
答案 1 :(得分:3)
您不需要将char设置为32位才能使用UTF-8编码。 UTF-8是可变长度编码,它设计用于8位字符,并向后兼容ascii。
你也可以使用32位的wchar_t
(在Linux上)但通常不会给你
因为Unicode处理比代码点管理复杂得多,所以增加了很多价值。
答案 2 :(得分:1)
UTF-8以几个字节编码1个字符。
另外,请勿编辑系统头文件。 (并且,修改CHAR_BITS将不起作用,重新编译内核/ gcc或诸如此类的东西)。
答案 3 :(得分:1)
我很确定CHAR_BIT是'char'变量类型中的位数,不是任何字符中的最大位数。正如您所注意到它在limits.h中是常量,它不会根据区域设置进行更改。
CHAR_BIT在任何合理的新/理智系统上将等于8 ......如今非8位词很少见:)
答案 4 :(得分:1)
C和C ++将char
定义为一个字节,即sizeof
返回1的整数类型。它不必是8位,但绝大多数时候,它是。恕我直言,应该命名为 byte
。但是在1972年创建C时,西方人不必处理多字节字符编码,因此你可以将“字符”和“字节”类型混为一谈。
你只需要忍受令人困惑的术语。或者typedef
它离开了。但不编辑您的系统头文件。如果您想要字符类型而不是字节类型,请使用wchar_t
。
但UTF-8字符串由8位代码单元组成,因此char
可以正常工作。你只需要记住char
和角色之间的区别。例如,不要这样做:
void make_upper_case(char* pstr)
{
while (*pstr != '\0')
{
*pstr = toupper(*pstr);
pstr++;
}
}
toupper('a')
按预期工作,但toupper('\xC3')
是一个无意义的尝试,可以大写半个字符。