C ++中的便携式wchar_t

时间:2009-01-21 21:39:22

标签: c++ windows portability wchar-t wstring

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

4 个答案:

答案 0 :(得分:4)

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

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

你可以定义一个你定义为四个字节的类型,并实现你自己的字符串等(因为C ++中的大多数文本处理都是模板化的),但是我不知道它能用得多好你的需求。

typedef int my_char; typedef std::basic_string<my_char> my_string;

这样的东西

答案 1 :(得分:3)

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

来自ustring项目的

gtkmm。如果使用gtkmm编程或使用glibmm,那应该是第一选择,它在内部使用utf-8Qt还有一个名为QString的字符串类。它以utf-16编码。 ICU是另一个创建可移植的unicode字符串类的项目,并且有一个UnicodeString类,内部似乎用utf-16编码,就像Qt一样。虽然没有用过那个。

答案 2 :(得分: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差异。

答案 3 :(得分:0)

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

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

糟糕的主意:定义类似typedef uint32_t mychar;的内容很糟糕。由于你不能使用iostream,你不能创建例如基于这个字符的stringstream,因为你无法在其中写入。

例如,这不起作用:

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

不会创建一个字符串。