2013-05-29 86 views
0

給定第一個字節(多字節字符)和字符集規範名稱,如何確定字符的字節長度?以字節爲單位的字符長度

最好使用ICU庫。

+0

這是一個問題嗎?投票結束。 –

+0

假設你開始閱讀一個流,你會看到第一個字節,你知道字符集,你能告訴還有多少字節需要閱讀才能得到整個字符?任何圖書館這樣做將不勝感激。謝謝。 –

回答

2

使用ucnv_getNextUCharICU庫。 以下代碼將二進制流拆分爲字符並打印每個字符的大小:

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

由於大多數原因,在設計字符集時,始終有一種方法可以通過第一個字符來確定字符的字節長度。所以只要說:

  • 如果它是UTF-16,每個字符都是兩個字節。
  • 如果它是UTF-8,可以存在三種情況:
    1. 字符下面0x80表示在格式of 0xxx xxxx
    2. 字符以上0x80的和下面的0x800是在上述的0x800處於110x xxxx10xx xxxx
    3. 字符格式的1110 xxxx10xx xxxx10xx xxxx
  • 格式如果是GBK,你可以告訴是否有字符代碼的另一個字節通過檢測該字符的第一個字節是否爲l比0x7f更大。
  • 對於iso-latin-1或類似的東西,總是有一個字節。
+0

0xFFFF以上的字符在UTF-16中使用4個字節。 –

+0

任何支持此操作的庫? –

相關問題