最近在做一个项目的时候,要求把全国的省市信息替换成拼音,比如“广东省”要替换成“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()从后面开始去除汉字时,多去除了一个字节,所以结果不正确。最后,建议尽量使用正则表达式来处理字符串。