PHP中不同編碼的漢字佔的位元組數不同gbk,GBK,UTF-8,utf-8
阿新 • • 發佈:2019-02-11
問題:
對於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系列, 安全可靠, 而且還支援猜編碼功能.