2009-01-21 220 views
5

C++中是否有可移植的wchar_t?在Windows上,它的2个字节。其他所有内容都是4个字节。我想在我的应用程序中使用wstring,但是如果我决定将它移出来,这会导致问题。C++中的便携式wchar_t

+0

您需要在Windows和其他OS安装(例如文件,套接字)之间共享数据吗?如果没有,那么我认为你不需要关心这个问题(只要你使用sizeof而不是2或4)。 – 2009-01-21 21:45:56

+0

我打算使用SQLite数据库。 – 2009-01-21 21:49:18

+0

http://stackoverflow.com/questions/421530/is-endian-conversion-required-for-wchart-data#421603 – 2009-01-22 02:47:51

回答

4

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

如果您打算在Windows和Linux/MacOSX版本之间传输数据,那么您不仅需要担心wchar_t,而且还需要出现用手段来处理所有的细节。

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

喜欢的东西typedef int my_char; typedef std::basic_string<my_char> my_string;

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-16ICU是另一个创建可移植的unicode字符串类的项目,并且有一个类似于Qt的类似于utf-16的内部编码的UnicodeString类。尽管没有使用过那个。

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

0

我的建议。使用UTF-8和std :: string。宽字符串不会带来太多附加价值。反正你无法将宽字符解释为某些字符从几个unicode代码点提取出来的字母。

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

坏主意:定义类似于typedef的东西uint32_t mychar;不好。因为你不能使用iostream,所以你不能在这个字符中创建例如stringstream,因为你不能写入它。

例如,这是行不通的:

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

难道你创建一个字符串。