最近在做一个项目的时候,要求把全国的省市信息替换成拼音,比如“广东省”要替换成“Guangdong”。

我的做法是先用rtrim()把字符串最后的“省”、“市”去掉,再将得到的字符串转成拼音(用的是DedeCMS的SpGetPinyin()函数)。转换完成后,看起来还不错,可是我找了半天居然没找到“广东省”!还以为是漏了。仔细看了一下,“广东省”变成了“Guang”,还有“山东省”成了“Shan”,反正就是带“东”的都只有一半拼音。难道SpGetPinyin()不认识“东”字?这也太奇怪了吧?

新建了一个测试文件,专门选了带“东”的汉字来测,都能正常转成拼音,不管编码是GBK还是UTF-8。

只能一行行的调试我的转换程序了。调试发现“广东省”经过rtrim()去掉“省”后,居然成了“广”!问题就出在这。换成

$location_name = preg_replace('/[省市]$/', '', $row['location_name']); // 删除“省”、“市”

就没问题了。

后台仔细测试过了trim()、ltrim()、rtrim()在GBK与UTF-8下去除汉字的情况,结果如下:

GBK下都没有问题:

原始字符串:
00000000h: CA A1 B9 E3 B6 AB CA A1                         ; 省广东省
ltrim()后
00000000h: B9 E3 B6 AB CA A1                               ; 广东省

rtrim()后
00000000h: CA A1 B9 E3 B6 AB                               ; 省广东

trim()后
00000000h: B9 E3 B6 AB                                     ; 广东

UTF-8下问题就来了,ltrim()是正常的,trim()和rtrim()从后面开始去除汉字就会出问题:

原始字符串:
00000000h: E7 9C 81 E5 B9 BF E4 B8 9C E7 9C 81             ; 省广东省
ltrim()后,显示:广东省
00000000h: E5 B9 BF E4 B8 9C E7 9C 81                      ; 广东省

rtrim()后,显示:省广
00000000h: E7 9C 81 E5 B9 BF E4 B8                         ; 鐪佸箍涓

trim()后,显示:广
00000000h: E5 B9 BF E4 B8                                  ; 骞夸

从上面的结果可以看出,trim()和rtrim()从后面开始去除汉字时,多去除了一个字节,所以结果不正确。最后,建议尽量使用正则表达式来处理字符串。

Published in PHP

No Responses to “trim()和rtrim()在UTF-8下去除汉字时不正常”

Leave a Reply

请输入算式结果(看不清请点击图片)
(必须)