2011-12-23 75 views
0
char *w = "Artîsté"; 
printf("%lu\n", strlen(w)); 
int z; 
for(z=0; z<strlen(w); z++){ 
    //printf("%c", w[z]); //prints as expected 
    printf("%i: %c\n", z, w[z]);//doesn't print anything 
} 

如果我運行它,它會崩潰在「」上。如何打印多字節字符,以及如何知道何時打出多字節字符?如何從utf8字符串中獲取字符

+3

*我怎麼知道什麼時候我碰到了多字節字符?*高位是1. – 2011-12-23 03:31:15

+1

您可能想看看UTF8是什麼:http://en.wikipedia.org/wiki/UTF-8 – 2011-12-23 03:31:47

+0

哪條線會崩潰?什麼平臺? – 2011-12-23 03:33:34

回答

1

如果你的執行環境使用UTF-8(Linux爲例),您的代碼將工作作爲 - 是的,只要你設置一個合適的場所,如setlocale(LC_ALL, "en_US.utf9");調用一個的printf之前。

演示:http://ideone.com/zFUYM

否則,你最好的選擇可能是轉換成寬字符串並打印。如果你打算用該字符串的單個字符做I/O以外的事情,那麼你必須這樣做。

至於打多字節字符,測試可移植的方法是,如果mblen()返回一個值大於1

+0

該代碼有效。但它不適用於OP printf(「%i:%c \ n」,z,w [z]);' – nos 2011-12-23 18:59:10

+0

@nos哦,它是在我回答後編輯的。 Dave的回答是正確的,然後, – Cubbi 2011-12-23 19:43:37

1

使用更大的寬字符和多字節功能:

int utf8len(char *str) 
{ 
    char *top=str+strlen(str); 
    int len; 
    for(len=0; str<top; len++) 
     str+=mblen(str, top-str); 
    return len; 
} 

int main() 
{ 
    setlocale(LC_ALL, "en_US.utf8"); 
    char *w = "Artîsté"; 
    printf("%lu\n", strlen(w)); 

    int z, len = utf8len(w); 
    wchar_t wstr[len+1]; 
    mbstowcs(wstr, w, len); 
    for(z=0; z<len; z++) 
     printf("%i: %lc\n", z, wstr[z]); 
} 

你很幸運與第一次printf,因爲你從來沒有改變過的數據,一旦你分裂了字符,你的輸出不再是utf8。

+0

這對我不起作用,它一旦打到「¡」就停止打印輸出。 – joels 2011-12-23 17:50:12

+0

如果您尚未設置語言環境,請將'setlocale(LC_ALL,「en_US.utf8」);'放在文件的頂部。 – Dave 2011-12-23 18:28:14

相關問題