PHP中不同编码的汉字占的字节数不同gbk,GBK,UTF-8,utf-8
2016-03-05 00:00
621 查看
摘要: 对于gb2312,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)这句话准确吗?utf-8的中文一定占用3个字节吗?我记得utf-8是不定字节数的啊,有些是2个字节有些是3个字节。
问题:
对于gb2312,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)这句话准确吗?utf-8的中文一定占用3个字节吗?我记得utf-8是不定字节数的啊,有些是2个字节有些是3个字节。
utf8是变长编码, 不一定是3字节, 可能是2~3, 当然ASCII字符还是1字节.
gbk也是变长编码, 非ASCII的2字节, ASCII还是1字节.
这两个编码对于非ASCII字符, 都是多字节的, 并且多字节字符每个字节都是>127的, 也就是负数(最高位是1).
另外, PHP里的strlen不是依靠判断字符串结尾的, 因为PHP是脚本语言, 它的字符串和C++的string是一样的, 将存储的字节个数当作字符串长度.
另外, PHP里想数数有多少个字节用strlen, 想数数有多少个字符, 用mb系列函数, 自己去了解一下.
还有些需求, 比如字符串匹配查找之类的, gbk是存在双字节匹配问题的, 两个连续汉字的中间2个字节可能被误认为其他字符, 所以不能用strstr之类的字节匹配函数(PHP里是纯字节匹配的, 不关心), 但utf-8是可以的, 它不会有类似的冲突, 另外最好的做法当然还是用mb系列, 安全可靠, 而且还支持猜编码功能.
问题:
对于gb2312,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)这句话准确吗?utf-8的中文一定占用3个字节吗?我记得utf-8是不定字节数的啊,有些是2个字节有些是3个字节。
utf8是变长编码, 不一定是3字节, 可能是2~3, 当然ASCII字符还是1字节.
gbk也是变长编码, 非ASCII的2字节, ASCII还是1字节.
这两个编码对于非ASCII字符, 都是多字节的, 并且多字节字符每个字节都是>127的, 也就是负数(最高位是1).
另外, PHP里的strlen不是依靠判断字符串结尾的, 因为PHP是脚本语言, 它的字符串和C++的string是一样的, 将存储的字节个数当作字符串长度.
另外, PHP里想数数有多少个字节用strlen, 想数数有多少个字符, 用mb系列函数, 自己去了解一下.
还有些需求, 比如字符串匹配查找之类的, gbk是存在双字节匹配问题的, 两个连续汉字的中间2个字节可能被误认为其他字符, 所以不能用strstr之类的字节匹配函数(PHP里是纯字节匹配的, 不关心), 但utf-8是可以的, 它不会有类似的冲突, 另外最好的做法当然还是用mb系列, 安全可靠, 而且还支持猜编码功能.
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- Perl ASCII 字符判断
- ASP.NET、ASP、PHP、JSP之间有什么区别?
- 将编码从GB2312转成UTF-8的方法汇总(从前台、程序、数据库)
- PHP VBS JS 函数 对照表