2017-03-09 8 views
1

我在C中使用iconv.h將編碼從ISO-8859-*轉換爲UTF-8。我需要傳入的流在瀏覽器中顯示。但轉換後的結果不會顯示在chrome中。在其他瀏覽器中,它工作正常。 串的示例如下iconv轉換爲UTF-8會導致不可顯示的字符集

char *str = "\x05\x86\x53"; 
char dest_str[100]; 
char *out = dest_str; 
size_t inbytes = strlen(str); 
size_t outbytes = sizeof dest_str; 
printf("Before Conversion: %2x %2x %2x\n",str[0],str[1],str[2]); 
iconv_t conv = iconv_open("UTF-8//TRANSLIT", "ISO-8859-9"); 

if (conv == (iconv_t)-1) { 
    perror("iconv_open"); 
    return 1; 
} 

if (iconv(conv, &str, &inbytes, &out, &outbytes) == (size_t)-1) { 
    perror("iconv"); 
    return 1; 
} 

dest_str[sizeof dest_str - outbytes] = 0; 
printf("After Conversion: %2x %2x %2x\n",dest_str[0],dest_str[1],dest_str[2]); 
puts(dest_str); 

輸出給出:轉換前:5 ffffff86 53

轉換後:5 ffffffc2 ffffff86

正在發生正確的轉換?如何解決Chrome中不可顯示字符的問題?

+0

你期待什麼顯示? – JeremyP

回答

0

據我所見,轉換是正確的。唯一的問題是UTF-8字符串有四個字節,但只打印前三個字節。

顯然,05是非打印字符。這是在abrowser背景下沒有意義的。 (你爲什麼要發送它?)Chrome可能拒絕使用控制代碼打印任何內容。

將0x86轉換爲0xC2 0x86是正確的。但是,您使用的字體可能沒有字形。在我的Mac上,這似乎是這種情況。

編輯

已經簽出ISO-8859-9事實證明,您所翻譯的序列包含一個ASCII控制碼(0×05),一個未定義的字符(0x86可以)和一個ASCII可打印字符內容(0x53或S)。轉換爲UTF-8將保留ASCII字符(可打印或不可打印),但將非ASCII字符正確轉換爲UTF-8兩字節序列。呈現爲文本時,三個角色中的兩個角色沒有意義,Chrome顯然拒絕這樣做。

+0

轉換是如何進行的?我希望在將數據發送到瀏覽器之前刪除控制字符。因此,我將不得不從字符串中刪除兩個字節的數據,而不是一個,即0xC2 0x86? –

+0

沒有'C2 86'不是控制字符,它是一個多字節的UTF-8字符。 '05'是一個控制字符,應該刪除。 – JeremyP

+0

0到31和127 tp 159的字符屬於控制字符的類別[鏈接](https://www.obliquity.com/computer/html/unicode0000.html)U + 0086實際上表示爲選定區域 –

相關問題