字符长度(字节)

时间:2013-05-29 16:01:07

标签: character-encoding icu

给定第一个字节(多字节字符)和charset规范名称,如何确定字符的字节长度?

最好使用ICU库。

2 个答案:

答案 0 :(得分:2)

使用 ICU 库中的 ucnv_getNextUChar 。 以下代码将二进制流拆分为字符并打印每个字符的大小:

const char * utf8_strings[] = {"Samotność - cóż po ludziach, czym śpiewak dla ludzi"};

icu::ErrorCode err;
UConverter* conv = ucnv_open("UTF-8", err);
size_t len = strlen(utf8_strings[0]);
const char* curr = utf8_strings[0]; 
do {
    const char* prev = curr;
    ucnv_getNextUChar(conv, &curr, curr+len, err);
    std::cout << prev[0] << "  " << curr - prev << std::endl;       
} while (curr < utf8_strings[0]+len);

答案 1 :(得分:1)

由于大多数原因,在设计字符集时,始终有一种方法可以通过第一个字符确定字符的字节长度。所以只说:

  • 如果是UTF-16,则每个字符都是两个字节。
  • 如果是UTF-8,可能有三种情况:
      低于0x80的
    1. 字符格式为of 0xxx xxxx
    2. 超过0x80且低于0x800的字符格式为110x xxxx 10xx xxxx
    3. 高于0x800的字符格式为1110 xxxx 10xx xxxx 10xx xxxx
  • 如果它是GBK,你可以通过检测这个char的第一个字节是否大于0x7f来判断是否有另一个char字节的字节。
  • 对于iso-latin-1或类似的东西,总有一个字节。