2009-06-18 76 views
1

我讀過一些有關讀取Unicode文件等的答案,大多數人都指向UTF8-CPP或iconv。C++文件讀取庫 - ANSI和Unicode

我找到的庫都不適用於ANSI和Unicode文件,理想情況下我想要一個函數,我傳遞一個文件名,它將返回該文件的內容,並且編碼是什麼並不重要,或者這是不可能的?

如果有的話,我會怎麼做呢?

+0

聖盃100%保證自動檢測文件編碼是不可能的。有算法猜測,但他們是不是100%可靠。 – 2009-06-18 16:08:05

回答

2

那麼,這是一個二進制讀取不是?所有其他形式是解釋的問題,然後確切的編碼等變得重要。

雖然由於BOM,在某些情況下unicode可以被自動檢測,但並不總是存在,並且失敗的檢測機制等於一個破損的程序。我認爲這就是爲什麼大多數人不會這樣做的原因。

+0

也許他指的Unicode文件名.. – 2009-06-18 12:33:42

0

如果您使用的是寬字符串,UTF8-CPP可以檢測UTF8(utf8 :: is_valid和utf8 :: find_invalid)並執行轉換(utf8 :: utf16to8)。它很好,問題是什麼?

0

您可以使用多種技術的組合:

一般來說,大多數Unicode文件開始與BOM。如果文件與0xfffe開始或0xfeff可能認爲它是Unicode的意思。很少有人使用UTF-32 AFAIK,但您仍然可以使用BOM方法進行猜測(請參閱Wiki頁面)。

如果是UTF-8文件,可以使用UTF8-CPP將其轉換爲UTF-16(wstring)。如果它是一個UTF-16文件,使用標準庫可能會很難閱讀。對於taht,你可以參考我的博客文章:

http://cfc.kizzx2.com/index.php/reading-a-unicode-utf16-file-in-windows-c/

對於UTF-32 - 如果有人使用它,我不知道,所以我沒有經驗:P