C++ 中的可移植 wchar_t
-
19-08-2019 - |
题
C++ 中有可移植的 wchar_t 吗?在 Windows 上,它是 2 个字节。其他都是 4 个字节。我想在我的应用程序中使用 wstring,但是如果我决定移植它,这会导致问题。
解决方案
如果你正在处理使用内部的程序,不用担心;在类A中的wchar_t的是相同的类B中。
如果您打算在Windows和Linux / MacOSX的版本之间传输数据,你就不是为wchar_t更担心,你需要拿出办法来处理所有的细节。
您可以定义一个类型,你会定义是无处不在四个字节,并实现自己的字符串,等等(因为在C ++中的大多数文本处理是模板化的),但我不知道该怎么好,将用于工作您的需求。
喜欢的东西typedef int my_char; typedef std::basic_string<my_char> my_string;
其他提示
“便携式 wchar_t”是什么意思?有一个 uint16_t
到处都是 16 位宽的类型,这通常是可用的。但这当然还没有构成一个字符串。字符串必须知道它的编码才能理解诸如 length()
, substring()
等等(因此当使用 utf8 或 16 时,它不会在代码点中间剪切字符)。我知道您可以使用一些与 unicode 兼容的字符串类。所有这些都可以免费在商业程序中使用(Qt 将在几个月内免费兼容商业程序,当 Qt 4.5 发布时)。
ustring
来自 gtkmm
项目。如果您使用 gtkmm 或使用 glibmm 进行编程,那应该是首选,它使用 utf-8
内部。 Qt
还有一个字符串类,称为 QString。它被编码为 utf-16
. ICU
是另一个创建可移植 unicode 字符串类的项目,并且有一个 UnicodeString
内部似乎以 utf-16 编码的类,如 Qt。不过还没用过那个。
所提出的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使用它,你不能创建基于在该字符例如字符串流,你不能就能够它来编写。
例如这是行不通的:
std::basic_ostringstream<unsigned> s;
ss << 10;
难道你创建一个字符串。