Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和x2B中的便携式wchar+; 在C++中有一个便携式的WHARGART吗?在Windows上,它是2个字节。其他所有数据都是4字节。我希望在我的应用程序中使用wstring,但如果我决定向下移植它,这将导致问题。_C++_Windows_Portability_Wchar T_Wstring - Fatal编程技术网

C和x2B中的便携式wchar+; 在C++中有一个便携式的WHARGART吗?在Windows上,它是2个字节。其他所有数据都是4字节。我希望在我的应用程序中使用wstring,但如果我决定向下移植它,这将导致问题。

C和x2B中的便携式wchar+; 在C++中有一个便携式的WHARGART吗?在Windows上,它是2个字节。其他所有数据都是4字节。我希望在我的应用程序中使用wstring,但如果我决定向下移植它,这将导致问题。,c++,windows,portability,wchar-t,wstring,C++,Windows,Portability,Wchar T,Wstring,您所说的“便携wchar\t”是什么意思?有一种uint16\t类型,它在任何地方都是16位宽的,通常是可用的。但这当然还不能构成一条线。一个字符串必须知道它的编码以理解诸如“代码>长度”(、子串()/之类的函数(因此,在使用UTF8或16时,它不会在代码点中间剪切字符)。我知道有一些unicode兼容的字符串类可以使用。所有这些都可以免费在商业程序中使用(当Qt4.5发布后,QtOne将在几个月内免费与商业程序兼容) 从这个项目中。如果您使用gtkmm编程或使用glibmm,这应该是首选,它在

您所说的“便携wchar\t”是什么意思?有一种
uint16\t
类型,它在任何地方都是16位宽的,通常是可用的。但这当然还不能构成一条线。一个字符串必须知道它的编码以理解诸如“代码>长度”(<)/代码>、<代码>子串()/<代码>之类的函数(因此,在使用UTF8或16时,它不会在代码点中间剪切字符)。我知道有一些unicode兼容的字符串类可以使用。所有这些都可以免费在商业程序中使用(当Qt4.5发布后,QtOne将在几个月内免费与商业程序兼容)


从这个项目中。如果您使用gtkmm编程或使用glibmm,这应该是首选,它在内部使用
utf-8
。还有一个字符串类,称为QString。它是用utf-16编码的。是另一个创建可移植unicode字符串类的项目,它有一个
UnicodeString
类,内部似乎是用utf-16编码的,比如Qt。但我没用过那个

如果您处理的是程序内部使用,不要担心;a类中的wchar\u t与B类中的wchar\u t相同

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

你可以定义一个类型,你将定义为四字节,并且实现你自己的字符串等(因为C++中的大多数文本处理是模板化的),但是我不知道这对你的需求有多大的帮助。
类似于
typedefint my_char;typedef std::basic_string my_string

建议的C++0x标准将具有
char16\u t
char32\u 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
根据标准,您需要专门处理整数类型。但是在VisualStudio2005上,我没有经过特殊处理就成功地处理了
std::basic_string


我计划使用SQLite数据库

然后您需要使用UTF-16,而不是
wchar\u 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;
std::basic_ostringstreams;

ss您是否需要在windows和其他操作系统安装(如文件、套接字)之间共享数据?如果没有,那么我认为您不需要关心这个问题(只要您使用sizeof而不是2或4)。我计划使用SQLite数据库。有关相关问题,请参阅。您将需要char_traits,并且不能专门化std::char_traits(根据命名空间std规则)。此外,您可以在内部简单地使用wchar_t/wstring。在外部,您可以使用UTF-8绕过Endianness混乱。在I/O上,使用sizeof(wchar_t)上专用的模板函数在wchar_t和UTF-8之间进行转换。-1使用my_char是个坏主意。您可以将字符串写入流,但不能使用Italy length()、substring()和Co执行任何操作。对编码没有任何线索,他们只是查看编码单元的大小并进行处理。@Mihai,std::string的函数确实如此。但这就是它不能用于utf8等的原因。@Johannes Schaub:但答案是“字符串必须知道其编码才能理解像length()、substring()这样的函数”,所以不,它不必知道。您可以在不知道编码的情况下按代码单位工作,所需的只是代码单位的大小。@Mihai,如果使用utf8,则代码单位的大小为8位-但要计算字符串的长度,知道这一点是不够的。你必须考虑连续字节,等等。否则,您将无法获得字符串的长度,而只能获得代码单元计数。当然,对于像ASCII这样的固定长度编码来说,这并不重要,知道代码单元的大小才是最重要的,这取决于“字符串的长度”是什么意思。如果要分配内存或报告磁盘使用情况,则重要的是代码单元的数量。如果您关心字符的数量,那么您确实需要知道编码。如果您关心字符串在文本终端中占用多少列,那又是另一回事。