C++ 中有可移植的 wchar_t 吗?在 Windows 上,它的 2 个字节。其他一切都是4个字节。我想在我的应用程序中使用 wstring,但是如果我决定移植它,这将导致问题。
4 回答
如果您正在处理程序内部的使用,请不要担心;A 类中的 wchar_t 与 B 类中的相同。
如果您计划在 Windows 和 Linux/MacOSX 版本之间传输数据,那么您需要担心的不仅仅是 wchar_t,您还需要想出处理所有细节的方法。
您可以定义一个您将在任何地方定义为四个字节的类型,并实现您自己的字符串等(因为 C++ 中的大多数文本处理都是模板化的),但我不知道这对您的需求有多好。
就像是typedef int my_char; typedef std::basic_string<my_char> my_string;
“便携式 wchar_t”是什么意思?到处都有一种 16 位宽的uint16_t
类型,这通常是可用的。但这当然还不能构成一个字符串。字符串必须知道其编码才能理解诸如 等函数length()
(substring()
因此在使用 utf8 或 16 时,它不会在代码点中间剪切字符)。我知道您可以使用一些与 unicode 兼容的字符串类。所有这些都可以免费用于商业程序(当 Qt 4.5 发布时,Qt 将在几个月内免费与商业程序兼容)。
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 与它一起使用,因此您不能基于此字符创建例如 stringstream,因为您将无法在其中写入。
例如,这将不起作用:
std::basic_ostringstream<unsigned> s;
ss << 10;
不会为您创建一个字符串。