2012-01-29 57 views
2


我試圖讀取ISO-8859(ANSI)編碼的文件,它包含一些西歐字符,如「é」 。
當我嘗試讀取文件並輸出結果時,所有特殊字符顯示爲whereas,而正常字母顯示正確。

如果我將文件轉換爲utf-8格式,然後做同樣的工作,一切都完美。
有沒有人有任何想法來解決這個問題?我試圖用wifstreamwstring的的代替ifstream的但並沒有多大幫助。閱讀ISO-8859類型文件包含特殊字符,如é在C + +

這裏是我的示例代碼:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    ifstream myFS; 
    myFS.open("test.txt", ios::in); 
    string myString; 
    if(myFS.is_open()){ 
     while(myFS >> myString) 
      cout << myString << endl; 
    } 
    myFS.close(); 
    return 0; 
} 

的test.txt(ISO-8859-15格式)包含:

abcd éfg 

結果:

abcd 
�fg 

任何意見可以理解的。 提前謝謝!


+)
忘了說我的系統環境。
我使用ubuntu 10.10(Maverick)console with g ++ ver 4.4.5
謝謝!

+2

這可能是控制檯輸出的問題。請告知有關您的環境的詳細信息 – CharlesB 2012-01-29 13:13:15

+0

剛剛添加了我的系統環境。它是Ubuntu 10.10 w/g ++ 4.4.5 – devEvan 2012-01-29 13:19:44

回答

7

您的控制檯設置爲使用UTF-8,因此當您僅使用cout將ISO-8859-15中的文件轉儲到控制檯時,它會顯示錯誤的字母。 ASCII碼< 128的字母在這兩種編碼中都是相同的,這意味着所有這些字符都將在屏幕上正確顯示。

該程序的輸出實際上是正確的,只是您的控制檯沒有設置爲正確顯示輸出。

我也建議在不是全部ascii的文件上使用ios::binary,否則以後可能在其他平臺上遇到問題。

+1

+1:正確。事實上,該程序甚至沒有編碼的概念..它只是漏斗字節。 – 2012-01-29 13:17:20

+0

我將結果輸出到文件中,而不是打印到控制檯屏幕上,結果證明文件包含正如你所說的正確字符。謝謝! – devEvan 2012-01-29 16:31:24