2012-04-12 63 views
1

我想寫一些俄文unicode文本由wfstream文件。以下代碼已被使用。c + + unicode寫入不起作用

wfstream myfile; 
locale AvailLocale("Russian"); 

myfile.imbue(AvailLocale); 

myfile.open(L"d:\\example.txt",ios::out); 
if (myfile.is_open()) 
{ 
    myfile << L"доброе утро" <<endl; 
} 

myfile.flush(); 
myfile.close(); 

面目全非的東西通過執行該代碼寫入到文件中,我使用VS 2008

+6

這是西里爾文,希臘沒有找到答案。 – dreamlax 2012-04-12 09:21:20

+1

「доброеутро」是俄語中的「早上好」。請嘗試使用「Καλημέρα」。 – Vlad 2012-04-12 09:23:55

+0

什麼編碼有你的源文件(* .cpp)?它必須是UTF-8。 – Raxillan 2012-04-12 11:11:32

回答

1

我不知道很多關於C++語言環境灌輸,但也許它不工作,因爲你'正在嘗試使用希臘語區域編寫西里爾文字符?

+0

我很抱歉它的語言環境AvailLocale(「Russian」);不是希臘文,有的東西正在寫入文件,但是當我在Internet Explorer瀏覽器中打開這個example.txt文件時,它會顯示出一些不可重現的字符 。如果我將這些「доброеутро」字符複製並粘貼到另一個文件中,請手動輸入example2.txt,然後將其正確顯示 – 2012-04-12 09:34:08

+0

爲什麼不發佈準確的代碼而不是重新輸入的內容? – dreamlax 2012-04-12 09:38:08

+0

我編輯了主查詢。請看看它。 – 2012-04-12 09:46:28

1

如果您使用std::locale("Russian"),則在使用VS2008時,該文件將被編碼爲「西里爾文(Windows)」(而不是某種Unicode格式)。例如,如果您使用Internet Explorer打開它並將編碼更改爲西里爾文(Windows),則字符變得可見。

以某種Unicode格式存儲文件更爲常見。

當我使用:

const std::locale AvailLocale 
     = std::locale(std::locale("Russian"), new std::codecvt_utf8<wchar_t>()); 

將其存儲爲UTF-8和在記事本中打開例如文件作爲UTF-8文件。它看到更多

同樣,您可以使用codecvt_utf16或其他編碼方案來編碼unicode字符。

codecvt_utf8特定於C++ 11。

或者您可以使用升壓: http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/codecvt.html 或實施類似的東西自己(從看http://www.boost.org/doc/libs/1_40_0/boost/detail/utf8_codecvt_facet.hpp它似乎並沒有那麼複雜)。

或者這個庫:http://utfcpp.sourceforge.net/

+0

當我使用上面的代碼,它會給出錯誤「錯誤C2039:'codecvt_utf8':不是'std'的成員」 – 2012-04-12 10:16:37

+0

我找到了原因。它已被添加到標準的Visual Studio 2010中,我正在使用VS 2008.有什麼其他的方式來實現它在VS 2008? – 2012-04-12 10:24:21

+0

我添加了一些替代品。 – BertR 2012-04-12 11:45:42