簡體   English   中英

C ++ 0x中的Unicode支持

[英]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?

還有類似coutcin東西已經為這些類型定義了,或者stdinstdout不支持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。

在新的C ++標准中,不會有Unicode流。

正如@ssmir所提到的,標准委員會將在C ++ 0x中添加對Unicode的流支持。 但是在功能版本委員會決定刪除對Unicode的流支持。 有關更多信息,請參閱此鏈接

它接口就像輸出Unicode字符串的唯一方法是將其轉換為帶有codecvt的 ASCII字符串。

在創建時,流嘗試從全局語言環境中獲取“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM