5

C++ 中有可移植的 wchar_t 吗?在 Windows 上,它的 2 个字节。其他一切都是4个字节。我想在我的应用程序中使用 wstring,但是如果我决定移植它,这将导致问题。

4

4 回答 4

4

如果您正在处理程序内部的使用,请不要担心;A 类中的 wchar_t 与 B 类中的相同。

如果您计划在 Windows 和 Linux/MacOSX 版本之间传输数据,那么您需要担心的不仅仅是 wchar_t,您还需要想出处理所有细节的方法。

您可以定义一个您将在任何地方定义为四个字节的类型,并实现您自己的字符串等(因为 C++ 中的大多数文本处理都是模板化的),但我不知道这对您的需求有多好。

就像是typedef int my_char; typedef std::basic_string<my_char> my_string;

于 2009-01-21T21:52:08.173 回答
3

“便携式 wchar_t”是什么意思?到处都有一种 16 位宽的uint16_t类型,这通常是可用的。但这当然还不能构成一个字符串。字符串必须知道其编码才能理解诸如 等函数length()substring()因此在使用 utf8 或 16 时,它不会在代码点中间剪切字符)。我知道您可以使用一些与 unicode 兼容的字符串类。所有这些都可以免费用于商业程序(当 Qt 4.5 发布时,Qt 将在几个月内免费与商业程序兼容)。

ustringgtkmm项目。如果您使用 gtkmm 编程或使用 glibmm,那应该是首选,它在utf-8内部使用。Qt还有一个字符串类,叫做QString。它被编码在utf-16. ICU是另一个创建可移植 unicode 字符串类的项目,并且有一个UnicodeString内部似乎以 utf-16 编码的类,如 Qt。不过没用过那个。

于 2009-01-21T21:50:42.483 回答
1

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

于 2010-08-20T13:08:53.337 回答
0

我的建议。使用 UTF-8 和 std::string。宽弦不会给你带来太多的附加值。无论如何,您不能将宽字符解释为字母,因为某些字符是从几个 unicode 代码点创建的。

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

坏主意:定义像 typedef 这样的东西uint32_t mychar;是不好的。由于您不能将 iostream 与它一起使用,因此您不能基于此字符创建例如 stringstream,因为您将无法在其中写入。

例如,这将不起作用:

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

不会为您创建一个字符串。

于 2010-08-20T13:16:06.633 回答