解决PHP trim()rtrim()ltrim()替换中文汉字乱码(�)的问题
代码示例如下:
echo rtrim('栾城县','县');
输出:
栾�
原因:
rtrim函数把参数都转成了UTF8后再进行比较。
对于中文,一般都是先转成Unicode,再根据下表转成UTF8。
UCS-4(UNICODE)编码 UTF-8字节流
U-00000000 – U-0000007F 0xxxxxxx
U-00000080 – U-000007FF 110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
解决方法
$str = '栾城县';
// 假设要替换掉“县”字
var_dump(mb_substr($str,0,-1,'utf-8'));
// 或者
var_dump(mb_substr($str,0,mb_strpos($str,'县'),'utf-8'));
// 或者 如果为了防止替换了“栾县城”这样的字符
// 可以从最右边开始替换,这样需要做一些判断
$len = strlen($str);
$len2 = mb_strpos($str,'县');
if($len == $len2 + 1){
var_dump(mb_substr($str,0,$len2,'utf-8'));
}else{
echo '不符合替换规则 >> ' . $str;
}
0
1
2
3
4
5
6
7
8
9
10
11
12
13
$str='栾城县';
// 假设要替换掉“县”字
var_dump(mb_substr($str,0,-1,'utf-8'));
// 或者
var_dump(mb_substr($str,0,mb_strpos($str,'县'),'utf-8'));
// 或者 如果为了防止替换了“栾县城”这样的字符
// 可以从最右边开始替换,这样需要做一些判断
$len=strlen($str);
$len2=mb_strpos($str,'县');
if($len==$len2+1){
var_dump(mb_substr($str,0,$len2,'utf-8'));
}else{
echo'不符合替换规则 >> '.$str;
}