2010-01-18 29 views
2

抱歉,如果問題是愚蠢的,並已被問及數千次,但我花了幾個小時搜索它,不能找到答案。令人討厭的Unicode和C++:簡單的方法來讀取ASCII/UTF-8/UTF-16 BE/LE文本文件

我想讀取的文本文件可以是以下任何一種:ASCII/UTF-8/UTF-16 BE/LE 我假設如果文件是unicode,則BOM始終存在。

是否有任何自動方式(STL,Boost或其他)使用文件流或任何文件逐行讀取,而不檢查BOM並始終將UTF8放入std :: string中?

在這個項目中,我只使用Windows。瞭解如何爲其他平臺解決問題也很好。

在此先感謝!

回答

2
+0

在我心底深處,我希望不要使用額外的庫。 非常感謝您的快速回復! – Andrew 2010-01-18 06:50:46

+0

請問,請告訴我這個lib如何被用來讀取文件?我發現只有轉換例程,這意味着我需要編寫我自己的輸入處理並要求它手動轉換 – Andrew 2010-01-18 07:11:22

+0

它實際上不能用於直接讀取文件;你需要使用'fgets()'來讀取文本,然後你可以通過一個轉換描述符。 – 2010-01-18 07:16:50

2

的BOM往往不存在於UTF-8文件。因此,在讀取數據並找到不是ASCII的字節之前,您無法知道文件是ASCII還是UTF-8。

此外,當你在Windows上時,你是否打算處理ISO-8859-1和Windows-1252?後者通常是記事本和寫字板等文件的默認文件。在這些情況下,情況更糟糕:人們只能在這種編碼,其他編碼和UTF-8之間進行啓發式區分。

ICU庫有一個character set detection system,您可以使用它來猜測文件可能的字符編碼。我不相信iconv具有這樣的功能。

ICU通常可用,已安裝在Mac和Linux上,但唉,不是Windows。這樣的例程也可以在Win32 API中使用。

+0

所有有效的ASCII文件也是有效的UTF-8文件。 – 2010-01-19 20:56:46

+0

夠正確!如果他最初的目的是他所需要的,那麼是的,使用BOM來檢測UTF-16變體以及不使用BOM來假定UTF-8(或ASCII)將起作用。但是,在更一般的情況下,在處理文本文件時,其他編碼會導致失敗。 – MtnViewMark 2010-01-20 03:15:17

+0

感謝您的好評,但我認爲編碼不會是我的問題,因爲他們的待遇肯定會成爲一個麻煩。 – Andrew 2010-01-20 06:56:48