在C和C++中正确使用字符串存储

use*_*893 10 c c++ unicode posix character-encoding

流行的软件开发人员和公司(Joel Spolsky,Fog Creek软件)在编写C或C++代码时倾向于使用wchar_t进行Unicode字符存储.何时以及如何在良好的编码实践中使用charwchar_t

在编写利用Unicode的软件时,我对POSIX合规性特别感兴趣.

使用wchar_t时,您可以在每个字符或每个数组元素的基础上查找宽字符数组中的字符:

/* C code fragment */
const wchar_t *overlord = L"ov€rlord";
if (overlord[2] == L'€')
    wprintf(L"Character comparison on a per-character basis.\n");
Run Code Online (Sandbox Code Playgroud)

如何在使用char时比较unicode字节(或字符)?

到目前为止,我在C 中比较字符串和char类型字符的首选方法通常如下所示:

/* 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));
Run Code Online (Sandbox Code Playgroud)

此方法扫描等效字节的字节.Unicode欧元符号占用3个字节.因此,需要比较三个char数组字节以了解Unicode字符是否匹配.通常,您需要知道要比较的字符或字符串的大小以及它为解决方案生成的位数.这根本不是处理Unicode的好方法.有没有更好的方法来比较char类型的字符串和字符元素?

另外,使用wchar_t时,如何将文件内容扫描到数组?函数fread似乎没有产生有效的结果.

一二三*_*一二三 10

如果你知道你正在处理unicode,既不适合char也不wchar_t适合,因为它们的大小是编译器/平台定义的.例如,wchar_tWindows(MSVC)上是2个字节,Linux(GCC)上是4个字节.C11和C++ 11标准更加严格,并定义了两个新的字符类型(char16_tchar32_t)以及相关的文字前缀,用于创建UTF- {8,16,32}字符串.

如果您需要存储和操作unicode字符,您应该使用专为该作业设计的库,因为前C11或C++ 11之前的语言标准都没有考虑过unicode.有一些可供选择,但ICU非常流行(并支持C,C++和Java).

  • 甚至C++ 11对unicode的东西也相当轻松.除了在utf8/16/32之间强制执行几种类型和标准转换之外,您将找不到诸如整理,比较,规范化等任何内容. (3认同)