2009-07-16 157 views
3

我在閱讀和使用unicode文件中的內容時遇到問題。閱讀Unicode文件

我正在製作一個unicode發行版,我試圖從一個unicode文件讀取內容,但數據有奇怪的字符,我似乎無法找到將數據轉換爲ASCII的方法。我正在使用fgets。我試過fgetws,WideCharToMultiByte,以及我在其他文章和帖子中發現的很多功能,但都沒有成功。

+4

你可能想澄清你的意思是「Unicode」。 UTF-8? UTF-16? – 2009-07-16 16:48:30

+1

如果您發佈相關代碼並告訴我們您看到的結果與您的期望有何不同,這將有所幫助。 – 2009-07-16 16:48:59

回答

7

因爲你提到WideCharToMultiByte我會假設你正在處理Windows。

「讀從Unicode文件內容...找到一種方法把數據轉換爲ASCII」可能是一個問題

此。如果您將Unicode轉換爲ASCII(或其他遺留代碼頁),您將面臨損壞/丟失數據的風險。 既然你是「在UNICODE版的工作」,你會想讀的Unicode 並保持統一。

所以你的最終緩衝區將不得不是wchar_t(或WCHARCStringW,同樣的事情)。

所以你的文件可能是utf-16或者utf-8(utf-32很少見)。 對於UTF-16的字節順序可能也會起作用。如果有一個物料清單,將有很大幫助。

快速步驟:

  • 打開文件與wopen,或_wfopen作爲二進制
  • 讀取第一字節使用以鑑定編碼BOM
  • 如果編碼是UTF-8,在一個字節讀陣列並將其轉換爲wchar_tWideCharToMultiByteCP_UTF8
  • 如果編碼是在wchar_t陣列中讀取的utf-16be(大端)和_swab
  • 如果編碼是在wchar_t數組中讀取UTF-16LE(小端)和你做

而且(如果你使用一個新的Visual Studio),您可能需要一個MS擴展的優勢,_wfopen 。它可以採取的編碼爲模式(像_wfopen(L"newfile.txt", L"rw, ccs=<encoding>");與編碼爲UTF-8或UTF-16LE)的一部分。它也可以根據BOM檢測編碼。

警告:要跨平臺有問題,wchar_t可能是2或4個字節,轉換例程不可移植...

相關鏈接:

1

我們需要更多信息來回答這個問題(例如,你是否試圖將Unicode文件讀入char緩衝區或wchar_t緩衝區?文件使用什麼編碼?),但現在您可能需要如果您的文件是Unicode文件並且您在文本模式下使用fgetws,請確保您沒有遇到this issue

當Unicode流的I/O功能 在文本模式下操作時, 源或目標流是 假定爲多字節 字符的序列。因此,Unicode 流輸入函數將 多字節字符轉換爲寬 字符(就像調用了 mbtowc函數一樣)。出於同樣的原因, 的Unicode流輸出函數 將寬字符轉換爲多字節 字符(就像通過調用wctomb函數一樣)。

1

Unicode是從數字代碼到字符的映射。 Unicode之前的步驟是文件的編碼:如何將某些連續字節轉換爲數字代碼?您必須檢查文件是否存儲爲大端,小端或其他。

通常,BOM(字節順序標記)被寫爲文件中的前兩個字節:FF FF或FE FF。

1

處理字符集的預期方式是讓語言環境系統執行它。

您必須在打開流之前設置正確的區域設置。

順便說一句你標記你的問題C++,你寫了關於fgets和fgetws,但不是 IOStreams;你的問題是C++還是C?

對於C:

#include <locale.h> 
setlocale(LC_ALL, ""); /* at least LC_CTYPE */ 

對於C++

#include <locale> 
std::locale::global(std::locale("")); 

那麼寬IO(wstream,fgetws)如果你的環境是Unicode的正確 集應該工作。如果沒有,你將不得不改變你的環境(我沒有 它是如何在Windows下工作的,對於Unix,設置LC_ALL變量是 的方式,請參閱locale -a獲取支持的值)。或者,用語言環境替換空字符串 也可以,但是您可以在程序中硬編碼 區域設置,並且用戶不會理解這一點。

如果您的系統不支持足夠的語言環境,那麼在C++中有 可能性爲您自己編寫轉換的一個方面。但這個答案的範圍是外 。

0

第一:我假設你正在嘗試閱讀UTF8編碼的Unicode(因爲你可以閱讀一些字符)。你可以檢查這個例如Notpad ++

對於你的問題 - 我會建議使用某種圖書館。你可以嘗試QT,QFile時支持Unicode(以及庫的其餘部分)。

如果這太多了,請使用特殊的unicode庫,例如:http://utfcpp.sourceforge.net/

並瞭解unicode:http://en.wikipedia.org/wiki/Unicode。在那裏你會找到對不同的Unicode編碼的引用。

0

你不能可靠Unicode轉換,甚至UTF-8,ASCII。字符集(Unicode文檔中的'平面')不映射回ASCII - 這就是Unicode首先存在的原因。