在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;
你是什么意思“便携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_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;
不会创建一个字符串。