2009-01-21 111 views
5

C++中是否有可移植的wchar_t?在Windows上,它的2個字節。其他所有內容都是4個字節。我想在我的應用程序中使用wstring,但是如果我決定將它移出來,這會導致問題。C++中的便攜式wchar_t

+0

您需要在Windows和其他OS安裝(例如文件,套接字)之間共享數據嗎?如果沒有,那麼我認爲你不需要關心這個問題(只要你使用sizeof而不是2或4)。 – 2009-01-21 21:45:56

+0

我打算使用SQLite數據庫。 – 2009-01-21 21:49:18

+0

http://stackoverflow.com/questions/421530/is-endian-conversion-required-for-wchart-data#421603 – 2009-01-22 02:47:51

回答

4

如果您正在處理程序內部的使用,請不要擔心; A類中的wchar_t與B類中的wchar_t相同。

如果您打算在Windows和Linux/MacOSX版本之間傳輸數據,那麼您不僅需要擔心wchar_t,而且還需要出現用手段來處理所有的細節。

您可以定義一個類型,您將定義爲四個字節,並實現自己的字符串等(因爲C++中的大多數文本處理都是模板化的),但我不知道這樣做會有多好滿足您的需求。

喜歡的東西typedef int my_char; typedef std::basic_string<my_char> my_string;

3

「portable wchar_t」是什麼意思?有一個uint16_t類型,在任何地方都是16位寬,這通常是可用的。但是,這當然不構成一個字符串呢。一個字符串必須知道它的編碼,才能明白length(),substring()等等的功能(所以它不會在使用utf8或16時在代碼點的中間切割字符)。有一些我知道你可以使用的unicode兼容字符串類。所有這些都可以在商業程序中免費使用(Qt 4.5將在幾個月內與Qt 4.5發佈時免費兼容商業程序)。

ustring來自gtkmm項目。如果使用gtkmm編程或使用glibmm,則應該是第一個選項,它在內部使用utf-8Qt也有一個名爲QString的字符串類。它的編碼是utf-16ICU是另一個創建可移植的unicode字符串類的項目,並且有一個類似於Qt的類似於utf-16的內部編碼的UnicodeString類。儘管沒有使用過那個。

1

所提出的C++ 0x標準將有char16_tchar32_t類型。在此之前,您必須重新使用整數來表示非wchar_t字符類型。

#if defined(__STDC_ISO_10646__) 
    #define WCHAR_IS_UTF32 
#elif defined(_WIN32) || defined(_WIN64) 
    #define WCHAR_IS_UTF16 
#endif 

#if defined(__STDC_UTF_16__) 
    typedef _Char16_t CHAR16; 
#elif defined(WCHAR_IS_UTF16) 
    typedef wchar_t CHAR16; 
#else 
    typedef uint16_t CHAR16; 
#endif 

#if defined(__STDC_UTF_32__) 
    typedef _Char32_t CHAR32; 
#elif defined(WCHAR_IS_UTF32) 
    typedef wchar_t CHAR32; 
#else 
    typedef uint32_t CHAR32; 
#endif 

根據該標準,則需要專門char_traits爲整數類型。但是在Visual Studio 2005上,我沒有特別處理std::basic_string<CHAR32>

我打算使用SQLite數據庫。

然後你需要使用UTF-16,而不是wchar_t

SQLite API也有一個UTF-8版本。您可能想要使用它來代替處理wchar_t差異。

0

我的建議。使用UTF-8和std :: string。寬字符串不會帶來太多附加價值。反正你無法將寬字符解釋爲某些字符從幾個unicode代碼點提取出來的字母。

所以在任何地方使用UTF-8並使用好的庫來處理自然語言。例如Boost.Locale。

壞主意:定義類似於typedef的東西uint32_t mychar;不好。因爲你不能使用iostream,所以你不能在這個字符中創建例如stringstream,因爲你不能寫入它。

例如,這是行不通的:

std::basic_ostringstream<unsigned> s; 
ss << 10; 

難道你創建一個字符串。