2011-03-12 51 views
3

我使用下一個代碼從文件中讀取文件中的所有元素,該文件的作用爲hFile,其大小與GetFileSize(hFile, NULL)一樣。在文本文件上調用ReadFile,出現奇怪(日文?)字符

_TCHAR* text = (_TCHAR*)malloc(sizeOfFile * sizeof(_TCHAR)); 
DWORD numRead = 0; 
BOOL didntFail = ReadFile(hFile, text, sizeOfFile, &numRead, NULL); 

運行後text在日文中是有些奇怪的東西或什麼的,而不是文件的內容。

我做錯了什麼?

編輯: 我的理解是編碼的問題,但後來我將如何將文本轉換爲LPCWSTR使用這樣的東西WriteConsoleOutputCharacter

+3

不要使用TCHAR,如果您期望ASCII/UTF-8使用「char」,如果您期望UTF-16使用wchar_t。 – Erik 2011-03-12 14:39:22

回答

5

現代IDE默認爲Unicode應用程序,這意味着_TCHAR實際上是wchar_tReadFile()使用簡單的字節,如果您使用它來直接填充_TCHAR數組,則會將8位字符解釋爲UTF-16 Unicode。這些通常顯示爲CJK(中文/日文/韓文)字形。

你有三個選擇:

  • 程序轉換成非Unicode
  • 使用含有Unicode文本(以UTF-16編碼)的文件,或
  • 從文件中讀取到一個char數組,然後使用MultiByteToWideChar()將文本轉換爲Unicode。

如果混合使用Unicode和非Unicode,請小心計算正確的緩衝區大小(字節數與字符數)。

請注意,如果您調用Windows版本的ANSI函數(例如WriteConsoleOutputCharacterA),則仍然可以在Unicode程序中使用窄字符與Windows。

1

您已經閱讀了ANSI或UTF-8文本文件轉換爲UTF-16字符串。

2

你得到了錯誤的字符串類型。來自以8位編碼編碼的文件的文本在通過字符類型(如使用UNICODE定義的TCHAR,使用16位編碼)查看時看起來像中文。修復:

char* text = (char*)malloc(...); 

您通常不得不煩惱更多關於用於編寫文本的編碼。例如,它可能是utf-8。您可以使用MultiByteToWideChar()從8位編碼轉換爲TCHAR(wchar_t,真的)。它的第一個論點是煩惱的人。

相關問題