Ads 468x60px

##EasyReadMore##

15 5月, 2014

[c++] 如何在UTF-8 環境下計算中文字數

如果使用 strlen(“你好”) 來算字數結果會是6
因為在 UTF-8 的情況下一個中文字元是 3 byte
那如果是要計算中英文混合的字數呢?
    char tmp_str[128];
    int bytes = 0;
    int i = 0;
    int len = 0;
    unsigned char c;
   
    sprintf(tmp_str,"%s", "12你好");
    len = strlen(tmp_str);
    while(len){
        c = (unsigned char)tmp_str[i];
        printf("c=%x\n",(int)c);
        if( c > 0x80){
            bytes++;
            // printf("now str = %s",tmp_str[i]);
        }
        i++;
        len--;
    }
    printf("tmp_str len = %d bytes = %d total_len = %d\n"\
    ,strlen(tmp_str),bytes,(strlen(tmp_str)-(bytes/3*2)));


可以看到結果會是
c=31
c=32
c=e4
c=bd
c=a0
c=e5
c=a5
c=bd
tmp_str len = 8 bytes = 6 total_len = 4
所以所有的字數為 4
1.c > 0x80 是因為UTF8 的編碼下大於0X7F即為中文
00000080-000007FF的字符用兩個字節表示 (中文的編碼範圍)
http://wenku.baidu.com/view/e0ea42fa700abb68a982fbea
2.值得注意的是 char c 前面要加上 unsigned 不然會因為二補數的關系結果會是負的
結果會變成 c=ffffffe4
這樣一來 c > 0x80就不成立了
http://jyhshin3.blogspot.tw/2010/06/blog-post_04.html

0 意見:

張貼留言

 
Blogger Templates