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