Linux下char类型可能带来的问题
2013-01-18 10:41
351 查看
/article/8157257.html
问题起因:
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下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类型可能带来的问题
- 在jstl中使用char类型的问题
- 改正 抢占式camera的可能带来死锁问题
- 如果把float改成char又对了 为什么运行的时候岀问题了 C语言 类型问题
- 解决 Linux 和 Windows 双启动带来的时间同步问题 | Linux 中国
- 关于 Linux C 中的头文件引用可能出现的问题解答
- 从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
- 关于 swift 开发的变量或属性声明的建议(避免类型转换以及带来的强转崩溃问题)
- int、short、char 类型超出范围赋值问题__原码,反码,补码
- Linux 下mysql修改数据库存放目录方法和可能遇到的问题
- Oracle中CHAR类型自动补足空格的问题
- Linux kernel data types, alignment, compat_ioctl 数据类型,对齐问题和compat_ioctl
- char类型数据的输出问题(上)
- 提交表单,有两个页面,一个是系统日志,一个是运行日志,其中日志类型不能用同一个"name",否则其中一个会出现404页面,可能是缓存问题吧(API?)
- 关于linux 下用gcc 无法编译 bool 类型的问题解决
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
- Linux基本数据类型大小——int,char,long int,long long int(/usr/include/limit.h文件对Linux下数据类型的限制及存储字节大小的说明)
- Window访问Linux共享"您可能没有权限使用网络资源"问题解决
- URL 中,查询字符串与HTML实体冲突,可能带来的问题.
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题