gcc,UTF-8和limits.h

时间:2010-04-18 18:14:27

标签: c linux gcc utf-8 locale

我的操作系统是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软件包会起作用吗?

5 个答案:

答案 0 :(得分:4)

CHAR_BITchar中的位数;永远不会改变这一点。它不会产生你想要的效果。

相反,使用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')是一个无意义的尝试,可以大写半个字符。