這是一個編碼問題。如果您逐字節讀取數據,您可以正確輕鬆地處理單字節編碼(如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,你可以指定內容的編碼......你必須是連貫的,你會看到一切正常)
這是一個字符編碼問題。網站使用什麼編碼以及您在內部使用什麼編碼? (UTF-8?ISO 8559-1/Latin-1?Windows 1252?) – Rup
您使用的表格是錯誤的。它的標題是「ASCII」,但它不是:ASCII只能達到127.看起來更像Windows-1252,它是ASCII的超集。 –