繁体   English   中英

C ++中的便携式wchar_t

[英]Portable wchar_t in C++

在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; typedef int my_char; typedef std::basic_string<my_char> my_string;

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

来自gtkmm项目的ustring 如果用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,你不能创建例如基于这个字符的stringstream,因为你无法在其中写入。

例如,这不起作用:

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

不会创建一个字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM