<?php
// PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换
// 答:原因是:中文是由多字节组成的,而只有英文系统的单个英文字符只有一个字节,所以该系统把中文的每一个字节都做了strtolower()处理,改变后的中文字节拼接在一起就成了乱码(新生成的编码映射对应的字符可能就不是中文了)
// 手动解决:用str_split(string string,intstring,intsplit_length = 1)按每个字节切割,像中文能切割成三个字节。对识别到的字节若是英文字母则进行转换。
// 英文字母转大写
function myStrtoupper($str){
$b = str_split($str, 1);
$r = '';
foreach($b as $v){
$v = ord($v);
if($v >= 97 && $v<= 122){ // 小写字母的ascii码值范围
$v -= 32;
}
$r .= chr($v);
}
return $r;
}
// 英文字母转小写
function myStrtolower($str){
$b = str_split($str, 1);
$r = '';
foreach($b as $v){
$v = ord($v);
if($v >= 65 && $v<= 90){ // 大写字母的ascii码值范围
$v += 32;
}
$r .= chr($v);
}
return $r;
}
$str = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl';
echo 'origin string: '.$str."\n";
// 转大写
$ret = myStrtoupper($str);
echo 'myStrtoupper result string: '.$ret.PHP_EOL;
// 转小写
$ret = myStrtolower($str);
echo 'myStrtolower result string: '.$ret.PHP_EOL;
// 结果
// origin string: a中你继续F@#$%^&*(BMDJFDoalsdkfjasl
// myStrtoupper result string: A中你继续F@#$%^&*(BMDJFDOALSDKFJASL
// myStrtolower result string: a中你继续f@#$%^&*(bmdjfdoalsdkfjasl