utf-8和GBK中文字符的长度计算
2013-10-31 23:00
423 查看
计算中文字符长度,通常会想到1个中文字符占两个字节。我本来一直也这么认为,可是一次计算utf-8中文字符的时候,似乎又并没这样计算,这就要看中文到底是以什么机器可识别字符存储的。
我首先在PHP中做了实验,用strlen()函数取中文字符串“我是”的长度,在UTF-8下是6,在GBK下是4,说明UTF-8每个中文字符占用了3字节,GBK每个中文字符占用2字节。
然后我又在WINDOWS 7下用EditPlus做了实验,分别保存纯文本(不含任何空格,只有末尾空字符,不算入长度)“我是”,然后用十六进制的方法查看,UTF-8下是"E6 88 91 E6 98 AF" 和 GBK下是"CE D2 CA C7",和PHP中所得结果相同。
所以基本确定了这两种字符集在处理中文时的不同。在我查资料前,我凭经验猜测,因为GBK主要存储是中文字符集,所表示字符的种类没有UTF-8这种国际通用字符集表示的种类多,自然不需要太大的字符空间。再查阅了UTF-8的原理,在看刚才中文字符的十六进制表示,如下:
0xxxxxxx ——1个字节
110xxxxx 10xxxxxx ——2个字节
1110xxxx 10xxxxxx 10xxxxxx ——3个字节
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx ——4个字节
"E6" 中主要看前面的"E",E=1110,表示由三个字节组成字符,所以中文这类才用3字节表示。
我首先在PHP中做了实验,用strlen()函数取中文字符串“我是”的长度,在UTF-8下是6,在GBK下是4,说明UTF-8每个中文字符占用了3字节,GBK每个中文字符占用2字节。
然后我又在WINDOWS 7下用EditPlus做了实验,分别保存纯文本(不含任何空格,只有末尾空字符,不算入长度)“我是”,然后用十六进制的方法查看,UTF-8下是"E6 88 91 E6 98 AF" 和 GBK下是"CE D2 CA C7",和PHP中所得结果相同。
所以基本确定了这两种字符集在处理中文时的不同。在我查资料前,我凭经验猜测,因为GBK主要存储是中文字符集,所表示字符的种类没有UTF-8这种国际通用字符集表示的种类多,自然不需要太大的字符空间。再查阅了UTF-8的原理,在看刚才中文字符的十六进制表示,如下:
0xxxxxxx ——1个字节
110xxxxx 10xxxxxx ——2个字节
1110xxxx 10xxxxxx 10xxxxxx ——3个字节
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx ——4个字节
"E6" 中主要看前面的"E",E=1110,表示由三个字节组成字符,所以中文这类才用3字节表示。
相关文章推荐
- oracle数据库查询锁及解锁
- ffmpeg教程
- 一个简单地MVVM模式实现,直接上码
- Java Web
- 可以兼容ie6的纯CSS三级鼠标悬停显示/隐藏菜单实现
- POJ上的LCA问题小节(转)
- 【Map】——Map用于存储具有映射关系的数据
- iOS7: 如何获取不变的UDID
- IO - 同步,异步,阻塞,非阻塞
- s3c2440与s3c2410区别
- 异步 同步 阻塞 非阻塞
- hello,world!
- 【默认空参数的构造函数】
- c++ 虚函数
- 只需在order by 的字段上加主键或索引即可让oracle先按该字段排序,然后再用rownum标号
- 常用排序方法(二)
- Servlet编写验证码
- 操作系统---第一,三章
- shell脚本---统计文件夹下文件类型信息
- 开源项目SlidingMenu的使用