2009-09-29 80 views
8

在C++中,用於存儲UTF-8字符串的最佳類型是什麼?如果可能的話,我想盡量避免滾動我自己的班級。UTF-8數據的最佳類型?

我最初的想法是std::string - 但是,這使用char作爲基礎類型。 char可能未簽名或簽名 - 它有所不同。在我的系統上,它已經簽名。但是,UTF-8代碼單元是未簽名的八位字節。這似乎表明它是錯誤的類型。

這導致我們到std::basic_string<unsigned char> - 這似乎符合法案:無符號,8位(或更大)的字符。

但是,大多數事情似乎使用char。例如,glib使用char。 C++的ostream的使用char

想法?

回答

9

我只是使用std :: string,因爲它與處理數據的UTF-8理想一致,就像您以null結尾的ASCII字符串一樣,除非您實際需要它們的unicode-ness。

我也喜歡GTKmm的Glib :: ustring,但這隻適用於編寫GTKmm(或至少Glibmm)應用程序。

+4

使用std :: string唯一真正的問題是,由於UTF-8是一種多字節編碼,因此預計可以處理字符的一些操作符實際上最終可能會處理部分字符。例如,除了不能直接訪問字符串長度以外,使用operator []將被打破以獲取「字符」。 (尺寸可用,但不是長度)。 – 2009-09-29 04:19:11

+0

您只需要將字符串視爲代碼單元數組而不是字符數組。然後,唯一不起作用的'string'成員函數就像'find_one_of'那樣將一組字符作爲參數。 – dan04 2011-02-11 13:53:36

+2

@Evan:「字符」和「長度」的定義在Unicode中非常複雜(因爲組合和連字和東西),它們永遠不會被直接訪問。最好不要假裝他們是。 – 2011-09-13 10:04:10

7

我一直只使用std :: string,我自己 - 不知何故,「簽名」與「無符號」的哲學問題幾乎在這樣的背景下從來沒有出現問題(編碼器和解碼器與UTF- 8是你很少寫的東西,畢竟;在應用程序上下文中,你只是使用std :: string作爲各種類型的「黑盒子」。

4

UTF-8是一個可變長度字符編碼。 std::basic_string僅支持固定長度字符編碼。如果您需要支持可變長度編碼,您可以嘗試ICU4C library

ICU是一套成熟的,廣泛使用的C/C++和Java庫,爲軟件應用程序提供Unicode和全球化支持。 ICU具有廣泛的可移植性,併爲所有平臺和C/C++與Java軟件之間的應用程序提供相同的結果。

如果你只需要存儲 UTF-8字符串我建議使用std::vector<char>。這將表明您無法對存儲的數據執行實際的字符串操作(這可能不正確)。