方法一
简介
PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换。
原因是:中文是由多字节组成的,而只有英文系统的单个英文字符只有一个字节,所以该系统把中文的每一个字节都做了strtolower()处理,改变后的中文字节拼接在一起就成了乱码(新生成的编码映射对应的字符可能就不是中文了)
<?php
function mystrtoupper($a){
$b = str_split($a, 1);//用str_split(string $string,int $split_length = 1)按每个字节切割,像中文能切割成三个字节。对识别到的字节若是英文字母则进行转换。
$r = '';
foreach($b as $v){
$v = ord($v);//对该字符转成acsii码
print_r($v);echo "--";
if($v >= 97 && $v<= 122){//判断是否为小写字母
$v -= 32;//转换成大写字母
}
$r .= chr($v);//将ascii码再转为相应的字符。
}
return $r;
}
$a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl';
echo 'origin string:'.$a."\n";
echo "<br/>";
echo 'ASC:';
$r = mystrtoupper($a);echo "<br/>";
var_dump($r);
结果
origin string:a中你继续F@#$%^&*(BMDJFDoalsdkfjasl
ASC:97--228--184--173--228--189--160--231--187--167--231--187--173--70--64--35--36--37--94--38--42--40--66--77--68--74--70--68--111--97--108--115--100--107--102--106--97--115--108--
string(39) "A中你继续F@#$%^&*(BMDJFDOALSDKFJASL"
PHP函数解决
用mbstring扩展,内部有个函数(mb_convert_case)
- 1.MB_CASE_UPPER:转成大写
- 2.MB_CASE_LOWER:转成小写
- 3.MB_CASE_TITLE :转成首字母大写
代码
<?php //注意world的区别 $str = "a中你继续F@#$%^&*(BMDJFDoalsdkfjasl tuzi"; var_dump(ucfirst($str));echo "<br/>"; var_dump(ucwords($str));echo "<br/>"; var_dump(mb_convert_case($str,MB_CASE_UPPER,'UTF-8'));echo "<br/>";
运行结果
string(44) "A中你继续F@#$%^&*(BMDJFDoalsdkfjasl tuzi"
string(44) "A中你继续F@#$%^&*(BMDJFDoalsdkfjasl Tuzi"
string(44) "A中你继续F@#$%^&*(BMDJFDOALSDKFJASL TUZI"
拓展
mb_strtolower() - 使字符串小写,以unicode为基础
mb_strtoupper() - 使字符串大写,以unicode为基础
strtolower() - 将字符串转化为小写
strtoupper() - 将字符串转化为大写
ucfirst() - 将字符串的首字母转换为大写
ucwords() - 将字符串中每个单词的首字母转换为大写