0

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

最好使用 ICU 库。

4

2 回答 2

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);
于 2013-06-03T13:13:29.300 回答
1

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

  • 如果是 UTF-16,则每个字符为两个字节。
  • 如果是UTF-8,可能会出现三种情况:
    1. 低于 0x80 的字符是格式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 或类似的东西,总是有一个字节。
于 2013-05-29T16:27:32.497 回答