2012-05-17 904 views
1

我使用ccs = encoding(如MSDN中所述)將編碼設置爲UTF-8,當打開與fopen文件。使用fopen(文件,「r,ccs = UTF-8」)無法讀取UTF8編碼文件

當寫入文件時,我在一個文本編輯器中的Unicode顯示,因爲它應該打開該文件,它工作正常

wchar_t* unicode_text = L"こんにちは"; 
FILE* f = fopen("C:\\test.txt", "w,ccs=UTF-8"); 
fwprintf(f, L"%s\n", unicode_text); 
fclose(f); 

。 但是,試圖從創建的文件讀取時未檢測到UTF-8編碼:

wchar_t buffer[1000]; 
FILE* f = fopen("C:\\test.txt", "r,ccs=UTF-8"); 
fgetws(buffer, 1000, f); 
fclose(f); 

MessageBoxW(0, buffer, 0, 0); 

這表明「我»¿AAA«ã¡ã¯」的消息框。

爲什麼會發生這種情況? ccs = UTF-8僅在打開要寫入的文件時有效嗎?

+0

'我»¿AAA«ã¡ã¯'絕對不會是ASCII。實際上,它完全是*非* -ASCII。 – Joey

+0

不夠公平,我已經刪除了關於ASCII的部分。 – sashoalm

+0

你爲什麼試圖做這個醜陋的非標準黑客,而不是隻需要一個UTF-8語言環境開始或使用'iconv'(乾淨/便攜的方式)? –

回答

1

的文檔意味着UTF-8編碼僅適用於寫(重點煤礦):

在Visual C++ 2005,支持的fopen Unicode文件流。一個標誌,指定所需的編碼可以被傳遞時打開一個新文件或覆蓋現有文件給fopen,像這樣:

注意,「讀取的現有文件」是顯眼。

+0

感謝您指出了這一點。那麼我會使用fgets + mbstowcs。 – sashoalm

+1

正好在MSDN下面說:「如果文件已經存在並打開讀取或追加,則使用字節順序標記(BOM)來確定正確的編碼。......該標誌僅在沒有BOM是否存在,或者文件是否是新文件。「 – alexander

+0

@alexander,正如我所說的「暗示」而不是明確的。我用這句話來描述當一個文件被覆蓋時會發生什麼。 –

1

嘗試這種

#include <locale.h> 

setlocale(LC_ALL, "Japanese"); 
+0

我認爲你可能是對的,這個問題缺少對'setlocale'的調用,但''Japanese''不是它的正確參數。 –

+0

怎麼樣, 在我的環境中的控制檯應用程序中,'setlocale(LC_ALL,「Japanese」);'能夠通過'wprintf(L「%s」,buffer);''輸出到控制檯而不浪費。所以,'fgetws(buffer,1000,f);'我認爲,因爲行爲能夠正確讀取。 日本版vs2010中的環境中的'MessageBoxW','setlocale(LC_ALL,「Japanese」)'可能是另一個可以正確顯示的問題,因爲即使您沒有設置,也不會設置。 – BLUEPIXY

+0

問題可能是默認字體。 – BLUEPIXY

0

看到fgets,fgetws

fgetws讀取寬字符參數str作爲多字節字符 字符串或根據是否流 在打開的寬字符串文本模式或二進制模式,

如果您嘗試「rb」。