PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换。
原因是:中文是由多字节组成的,而只有英文系统的单个英文字符只有一个字节,所以该系统把中文的每一个字节都做了strtolower()处理,改变后的中文字节拼接在一起就成了乱码(新生成的编码映射对应的字符可能就不是中文了)
手动解决:用str_split(string $string,int $split_length = 1)按每个字节切割,像中文能切割成三个字节。对识别到的字节若是英文字母则进行转换。
<?php function mystrtoupper($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($v);//对该字符转成acsii码 if($v >= 97 && $v<= 122){//判断是否为小写字母 $v -= 32;//转换成大写字母 } $r .= chr($v);//将ascii码再转为相应的字符。 } return $r; } $a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl'; echo 'origin string:'.$a."\n"; echo 'result string:'; $r = mystrtoupper($a); var_dump($r);
结果:
origin string:a中你继续F@#$%^&*(BMDJFDoalsdkfjasl result string:string(39) "A中你继续F@#$%^&*(BMDJFDOALSDKFJASL"
PHP函数解决:用mbstring扩展,内部有个函数
string mb_convert_case (string $str ,int $mode [,string $encoding = mb_internal_encoding()])
$mode有三种模式:
1.MB_CASE_UPPER:转成大写
2.MB_CASE_LOWER:转成小写
3.MB_CASE_TITLE :转成首字母大写
$encoding默认使用内部编码;也可以显示使用如’UTF-8’;
可以用echo mb_internal_encoding();来查看;
推荐使用该扩展,不仅对中文适用,对其他语言也适用。
$name = mb_strtoupper($name, 'UTF-8');
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn