流行的软件开发商和公司(
Joel Spolsky,Fog Creek software)在编写C或C代码时倾向于使用wchar_t进行Unicode字符存储.对于良好的编码习惯,应该何时以及如何使用char和wchar_t?
在编写利用Unicode的软件时,我对POSIX合规特别感兴趣.
使用wchar_t时,可以在每个字符或每个数组元素的基础上查找宽字符数组中的字符:
@H_301_6@/* C code fragment */ const wchar_t *overlord = L"ov€rlord"; if (overlord[2] == L'€') wprintf(L"Character comparison on a per-character basis.\n");在使用char时如何比较unicode字节(或字符)?
到目前为止,我喜欢在C中比较char和char的字符串的首选方法通常如下所示:
@H_301_6@/* C code fragment */ const char *mail[] = { "ov€rlord@masters.lt","ov€rlord@masters.lt" }; if (mail[0][2] == mail[1][2] && mail[0][3] == mail[1][3] && mail[0][3] == mail[1][3]) printf("%s\n%zu",*mail,strlen(*mail));该方法扫描Unicode字符的等效字节. Unicode欧元符号€占用3个字节.因此,需要比较三个字符数组字节来知道Unicode字符是否匹配.通常,您需要知道要比较的字符或字符串的大小以及它为解决方案所产生的位数.这根本看起来不是一个很好的处理Unicode的方法.有更好的比较字符串和char类型的字符元素的方法吗?
解决方法
如果你知道你正在处理unicode,那么char和wchar_t都是适合的,因为它们的大小是编译器/平台定义的.例如,wchar_t在Windows(MSVC)上为2字节,而Linux(GCC)为4字节. C11和C11标准已经更加严格,并且定义了两个新的字符类型(char16_t和char32_t),其中包含用于创建UTF- {8,16,32}字符串的相关文字前缀.
如果您需要存储和操作unicode字符,则应使用专为该作业而设计的库,因为C11或C11之前的语言标准都不是用unicode写入的.有一个few to choose from,但是ICU非常受欢迎(并支持C,C和Java).