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_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差异的。

我的建议。使用UTF-8的std :: string。宽字符串不会带给你太多的附加值。正如你无论如何不能解释宽字符为字母从多种Unicode代码点装箱一些字符。

所以,在任何地方使用UTF-8和使用良好的库来处理自然语言。像例如Boost.Locale。

坏主意:定义是这样的typedef uint32_t mychar;是坏的。正如你不能用的iostream使用它,你不能创建基于在该字符例如字符串流,你不能就能够它来编写。

例如这是行不通的:

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

难道你创建一个字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top