免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2564 | 回复: 1
打印 上一主题 下一主题

php strlen utf8一个中文算3个字节吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-02 18:59 |只看该作者 |倒序浏览
对于gb2312,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)
这句话准确吗?utf-8的中文一定占用3个字节吗?我记得utf-8是不定字节数的啊,有些是2个字节有些是3个字节。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-11-03 00:04 |只看该作者
utf8是变长编码, 不一定是3字节, 可能是2~3, 当然ASCII字符还是1字节.

gbk也是变长编码, 非ASCII的2字节, ASCII还是1字节.

这两个编码对于非ASCII字符, 都是多字节的, 并且多字节字符每个字节都是>127的, 也就是负数(最高位是1).

另外, PHP里的strlen不是依靠\0判断字符串结尾的, 因为PHP是脚本语言, 它的字符串和C++的string是一样的, 将存储的字节个数当作字符串长度.

另外, PHP里想数数有多少个字节用strlen, 想数数有多少个字符, 用mb系列函数, 自己去了解一下.

还有些需求, 比如字符串匹配查找之类的, gbk是存在双字节匹配问题的, 两个连续汉字的中间2个字节可能被误认为其他字符, 所以不能用strstr之类的字节匹配函数(PHP里是纯字节匹配的, 不关心\0), 但utf-8是可以的, 它不会有类似的冲突, 另外最好的做法当然还是用mb系列, 安全可靠, 而且还支持猜编码功能.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP