Linux下char类型可能带来的问题

来源:互联网 发布:什么是4g网络 编辑:程序博客网 时间:2024/05/19 02:17

http://blog.csdn.net/xiaobai1593/article/details/7070007


问题起因:

linux下C++采用utf-8编码方式,因此char类型不是单纯的一个字符一个字节。

一个英文字符占一个字节,而一个中文字符则不只占了一个字节(具体查看Unicode编码方案简介及实现一文)

如下所示,分别输出中文的“王子”和其中文拼音的“wangzi”

代码:

[cpp] view plaincopy
  1. <span style="font-family:'Microsoft YaHei';font-size:12px;">    char name[16]={0};  
  2.     strcpy(name, "WangZi");  
  3.     //strcpy(name, "王子");</span>  
在Linux环境下,内存中分别表示如下:

print name

$1 = "WangZi\000\000\000\000\000\000\000\000\000"

易知,一个英文字符占了一个byte(别忘了加上终止符)

print name
$1 = "王子\000\000\000\000\000\000\000\000\000"

可见,一个中文字符占用了3个byte

原因:

在Linux系统中,默认使用的是:Utf-8编码方式

(Utf-8是Unicode编码方式的一种实现,属于变长编码)

可能带来的问题1:

当字符串中含有中文,linux下printf()可以正常输出显示。但是,这样的char数组,传递个windows的程序(如wine上运行的程序)使用时,会出现乱码现象。因此,需要把它们转化为wchar_t类型。

我们在linux下使用mbstowcs()函数来将char类型转换wchar_t类型,然后再将wchar_t传递出去;

问题2:

在windows程序上得到的却是每个字节后面都有一个0值。

原因在于:linux下GCC规定的wchar_t是32bit(即4字节),而windows  VC中的wchar_t占用16bit(即2字节)。

使用MultiByteToWideChar()(Windows下的函数)可以将传递的char字符串(w0a0n0g0z0i0)成功转为两字节的wchar_t

具指点是说linux下char字符串使用utf-8编码,所以使用上面将char类型的字符串转为宽字符类型。