Linux下char类型可能带来的问题
2014-12-30 23:48
260 查看
问题起因:
linux下C++采用utf-8编码方式,因此char类型不是单纯的一个字符一个字节。
一个英文字符占一个字节,而一个中文字符则不只占了一个字节(具体查看Unicode编码方案简介及实现一文)。
如下所示,分别输出中文的“王子”和其中文拼音的“wangzi”
代码:
[cpp] view
plaincopy
<span style="font-family:'Microsoft YaHei';font-size:12px;"> char name[16]={0};
strcpy(name, "WangZi");
//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类型的字符串转为宽字符类型。
相关文章推荐
- Linux下char类型可能带来的问题
- MSCRM4.0删除Money类型属性可能引起的问题
- 基于自组网技术的智能无线抄表方案 现代生活中,水表、电表和煤气表的抄录和收费,是城市生活的一个大问题。人工入室抄表,扰民不说,还可能给居民带来不安全因素;对于各职能公司来说,派人上门抄表也无形中耗费了大量人力资源和时间。近年来,信息化社会在逐 步改变人们的
- "非规范"数据类型带来的问题
- java泛型、泛型的内部原理:类型擦除以及类型擦除带来的问题
- java 泛型的内部原理:类型擦除以及类型擦除带来的问题
- 扩展类型带来的问题
- Java泛型(二)泛型的内部原理:类型擦除以及类型擦除所带来的问题
- URL 中,查询字符串与HTML实体冲突,可能带来的问题.
- 华为李开新:产业融合为解决道路问题带来可能
- android屏幕旋转可能带来的问题
- 类型转换带来的问题
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
- EntityFramework中使用Include可能带来的问题
- "非规范"数据类型带来的问题
- (php的弱类型导致的小问题)某变量可能是数字或非数字(对象、字符串、json等)时,应该如何去判断
- MSCRM4.0删除Money类型属性可能引起的问题
- tomcat7可能带来的问题
- URL 中,查询字符串与HTML实体冲突,可能带来的问题.
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题