2011-06-30 77 views
0

我正在用Curl從網站上讀取文本。所有RAWDATA正在返回逐個字符與C:轉換特殊的ASCII字符ÄÜÜ

return memEof(mp) ? EOF : (int)(*(unsigned char *)(mp->readptr++)); 

我的問題是,所有的特殊字符,如ÄÖÜäöüß等都是錯誤的,顯得很神祕。我目前手動修正他們通過使用此表調整它們的值:

http://www.barcoderesource.com/barcodeasciicharacters.shtml

我現在想知道,如果有一個更優雅的方式來做到這一點,其他人如何處理這類問題。

+3

這是一個字符編碼問題。網站使用什麼編碼以及您在內部使用什麼編碼? (UTF-8?ISO 8559-1/Latin-1?Windows 1252?) – Rup

+1

您使用的表格是錯誤的。它的標題是「ASCII」,但它不是:ASCII只能達到127.看起來更像Windows-1252,它是ASCII的超集。 –

回答

1

這是一個編碼問題。如果您逐字節讀取數據,您可以正確輕鬆地處理單字節編碼(如ISO-8859「系列」等等),前提是您可以根據需要使用目標編碼正確轉換它們。但通過UTF-8等編碼,您不那麼幸運,因爲要獲得正確的代碼,您需要讀取1個字節,或者2個或3個字符......如果將它們串入字符串中,並將字符串打印出來,輸出設備的預期編碼與輸入編碼相同,無論如何你都會得到正確的字符。

如果沒有發生,並且您不打印每個字節就好像它確實是一個符號一樣,那麼輸出設備的預期編碼與寫入字符串的編碼不匹配。

如果輸出,一旦你打印字符串「完全」看起來沒問題,那麼問題是你正在將每個字節解釋爲單個字符,而不是(你有一個字符的多字節編碼像特殊字符你提到過;可能是UTF-8,但它可能不是)。

如果在兩種情況下(當您逐個打印每個字節並輸出保留整個字節序列的字符串時)得到相同的結果,則輸出設備的預期編碼是單字節編碼,如輸入編碼,但它們不匹配。

進一步的細節將需要知道如何收集您閱讀的字節,以便打印它們並說它們看起來很神祕。

一個例子。

const char *string = "\xc3\xa8\xc3\xb2\xc3\xa0"; 
int i; 
for(i = 0; string[i] != 0; i++) 
{ 
    printf("%c\n", string[i]); 
    // using \n is important; if you "sequence" the chars and the output enc is 
    // utf-8, you obtain the right output 
} 
printf("%s", string); 

如果輸出設備編碼爲UTF-8,則獲得不同的結果;如果它是一個單字節編碼,你會得到相同的輸出(除了換行符),但就我寫的內容而言,它是「錯誤的」,即èòà。

「相同的」文本在Latin1中是「\ xe8 \ xf2 \ xe0」。 Latin1是單字節編碼,因此上述語音適用。如果打印在瞭解UTF-8的終端上,您可以獲得類似以下內容的東西:...

因此,編碼很重要,設備/格式輸出編碼也很重要,並且您必須知道兩者以便處理和顯示正確的文字。 (關於格式,一個例子可能是html,你可以指定內容的編碼......你必須是連貫的,你會看到一切正常)

1

我想你必須使用外部庫,如iconv來創建一個wchar_t字符串,其中包含的數據。這取決於使用的字符編碼。