[英]Unicode support in C++0x
我正在嘗試在C ++ 0x中使用新的unicode字符。 所以我寫了示例代碼:
#include <fstream>
#include <string>
int main()
{
std::u32string str = U"Hello World";
std::basic_ofstream<char32_t> fout("output.txt");
fout<<str;
return 0;
}
但是在執行這個程序后,我得到了空的output.txt文件。 那么為什么它不打印Hello World?
還有類似cout
和cin
東西已經為這些類型定義了,或者stdin
和stdout
不支持Unicode?
編輯:我正在使用g ++和Linux。
編輯: АТТЕNTION。 我發現,標准委員會駁回了來自C ++ 0x的Unicode流。 所以以前接受的答案不再正確。 有關更多信息,請參閱我的答案
Unicode字符串文字支持始於 GCC 4.5。 也許這就是問題所在。
[編輯]
經過一些挖掘后,我發現N2035中描述了這個新的unicode文字的流,它包含在標准草案中。 根據這個文檔,你需要u32ofstream
輸出你的字符串,但GCC 4.5 C ++ 0x庫中沒有這個類。
作為一種解決方法,您可以使用普通的fstream:
std::ofstream fout2("output2.txt", std::ios::out | std::ios::binary);
fout2.write((const char *)str.c_str(), str.size() * 4);
這樣我就可以在我的Intel機器上輸出你的字符串UTF-32LE(這是一個小端)。
[編輯]
關於u32ofstream
的狀態我有點不對:根據C ++標准委員會網站上的最新草案 ,你必須像你一樣使用std::basic_ofstream<char32_t>
。 這個類將使用codecvt<char32_t,char,typename traits::state_type>
class(參見§27.9.1.1的結尾),該類必須在標准庫中實現(在文檔中搜索codecvt<char32_t
),但它不可用於GCC 4.5。
在創建時,流嘗試從全局語言環境中獲取“codecvt”,但無法獲得一個,因為唯一的標准codecvt用於char和wchar_t。 因此,流對象的_M_codecvt成員為NULL。 稍后,在嘗試輸出期間,您的代碼會在basic_ios.h中的facet檢查函數中拋出異常(對用戶不可見),因為facet是從_M_codecvt初始化的。
將facet添加到與流關聯的本地,以執行從char32_t到正確輸出的轉換。 使用包含正確類型的codecvt的語言環境來標記流。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.