C++中是否有可移植的wchar_t?在Windows上,它的2個字節。其他所有內容都是4個字節。我想在我的應用程序中使用wstring,但是如果我決定將它移出來,這會導致問題。C++中的便攜式wchar_t
回答
如果您正在處理程序內部的使用,請不要擔心; A類中的wchar_t與B類中的wchar_t相同。
如果您打算在Windows和Linux/MacOSX版本之間傳輸數據,那麼您不僅需要擔心wchar_t,而且還需要出現用手段來處理所有的細節。
您可以定義一個類型,您將定義爲四個字節,並實現自己的字符串等(因爲C++中的大多數文本處理都是模板化的),但我不知道這樣做會有多好滿足您的需求。
喜歡的東西typedef int my_char; typedef std::basic_string<my_char> my_string;
「portable wchar_t」是什麼意思?有一個uint16_t
類型,在任何地方都是16位寬,這通常是可用的。但是,這當然不構成一個字符串呢。一個字符串必須知道它的編碼,才能明白length()
,substring()
等等的功能(所以它不會在使用utf8或16時在代碼點的中間切割字符)。有一些我知道你可以使用的unicode兼容字符串類。所有這些都可以在商業程序中免費使用(Qt 4.5將在幾個月內與Qt 4.5發佈時免費兼容商業程序)。
ustring
來自gtkmm
項目。如果使用gtkmm編程或使用glibmm,則應該是第一個選項,它在內部使用utf-8
。 Qt
也有一個名爲QString的字符串類。它的編碼是utf-16
。 ICU
是另一個創建可移植的unicode字符串類的項目,並且有一個類似於Qt的類似於utf-16的內部編碼的UnicodeString
類。儘管沒有使用過那個。
所提出的C++ 0x標準將有char16_t
和char32_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
差異。
我的建議。使用UTF-8和std :: string。寬字符串不會帶來太多附加價值。反正你無法將寬字符解釋爲某些字符從幾個unicode代碼點提取出來的字母。
所以在任何地方使用UTF-8並使用好的庫來處理自然語言。例如Boost.Locale。
壞主意:定義類似於typedef的東西uint32_t mychar;
不好。因爲你不能使用iostream,所以你不能在這個字符中創建例如stringstream,因爲你不能寫入它。
例如,這是行不通的:
std::basic_ostringstream<unsigned> s;
ss << 10;
難道你創建一個字符串。
- 1. 便攜式C#IDE?
- 2. 帶C的便攜式dingbats#
- 3. 便攜式C#數據庫
- 4. C++:便攜式替代CryptGenRandom
- 5. 便攜式C++多線程
- 6. 便攜式VFS庫C++
- 7. 便攜式流編寫C#
- 8. 便攜式C++對齊?
- 9. 便攜式Eclipse
- 10. 便攜式MongoDB?
- 11. 便攜式erlang
- 12. Windbg便攜式?
- 13. XmlNode在C#便攜式項目中
- 14. 便攜式方式
- 15. C#.NET 4.5的HttpWebRequest便攜式crossplatforms
- 16. 便攜式C#的最佳實踐
- 17. Win32/Unix的C++便攜式NaN
- 18. 用於C的便攜式數據庫#
- 19. 便攜式在c/C++中創建時間戳的方式
- 20. 便攜式WAMP包?
- 21. 便攜式shebang線
- 22. 便攜式Vim E117
- 23. 便攜式領域
- 24. 便攜式__attribute__((__packed__))
- 25. 便攜式PySide庫?
- 26. Xamarin.Forms便攜式+ Mono.Data.Sqlite.Portable
- 27. 便攜式類庫
- 28. Python便攜式pyinstaller
- 29. C++編譯爲便攜式程序集?
- 30. 便攜式獨立C#編譯器
您需要在Windows和其他OS安裝(例如文件,套接字)之間共享數據嗎?如果沒有,那麼我認爲你不需要關心這個問題(只要你使用sizeof而不是2或4)。 – 2009-01-21 21:45:56
我打算使用SQLite數據庫。 – 2009-01-21 21:49:18
http://stackoverflow.com/questions/421530/is-endian-conversion-required-for-wchart-data#421603 – 2009-01-22 02:47:51