PHP中不同编码的汉字占的字节数不同gbk,GBK,UTF-8,utf-8

时间:2021-10-13 11:06:45

问题:

对于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系列, 安全可靠, 而且还支持猜编码功能.