php 兼容unicode文字的字符串大小写转换,php实现兼容Unicode文字的字符串大小写转换strtolower()和strtoupper()...

前言

网上流传着这么一个腾讯笔试题:

PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换。

举个例子,我们直接对中英文混排的字符串处理是会出乱码的,如:

我们知道中文在 UTF8 编码里是由3个字符组成的,那么换个思路,我们可以把一个中文当成3个字符来处理,同理再换个思路,在一个把小写英文转换成大写英文的函数里,我们要处理 的只有小写字母,那么我们就可以对一个字符串逐个字符进行处理,只处理小写字母,那么如何判断一个字符是小写字母呢,当然是用 ascii 码了,使用 linux 或者 mac os (实际上也为 linux 系统)的朋友可以直接使用命令 man ascii 查看字符 ascii 码对应值:

由 ascii 表我们看出英文小写字母的ascii 值在  97 ~ 122 之间,由此可得出我们的程序:

ZGF0YTppbWFnZTtiYXNlNjQsUjBsR09EbGhGQUFVQU5RSEFESktZcEtsdWMzUDA1cXk0akpkdGEvTTkyS1EzdnY4L25LaTRySy8wckxDNm1KNm10SGU3c0hONFpXMTlpSkxtVXAyd3FLeTBuS2E4aUpDZ3NMVjl1THE4cUt5d25LYTJvS3k0bEtDMHFMQzhxS3F3bktTMG9LbjdjREkxQUFBQUNINUJBRUFBQjhBTEFBQUFBQVVBQlFBQUFXRTRDZU9aR21lYUtxdUxLa29TUndKclhMY2g3WFFhNElmQWMrdWQ2QVVHSUhDUytOd01FNldYNlh3NnhBYXBzMkJpVUZvZnBJQ3dWTUszQ29WeHVEUVpCZ0loRWY1MEVWYzFyZ0tKU0lubVJrTURRMGRCeDBJQmhrWmZHVUFqWTBjT0F3VUNoWjlLUVlIaUlrWkc1WW9FQWNSb2hZYkFaNG5FSEFQcTZzVExhK3dzU1VoQURzPQ==

function mystrtoupper($a){

$b = str_split($a, 1);

$r = '';

foreach($b as $v){

$v = ord($v);

if($v >= 97 && $v<= 122){

$v -= 32;

}

$r .= chr($v);

}

return $r;

}

$a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl';

echo 'origin string:'.$a."\n";

echo 'result string:';

$r = mystrtoupper($a);

var_dump($r);

ZGF0YTppbWFnZTtiYXNlNjQsUjBsR09EbGhGQUFVQU5RSEFESktZcEtsdWMzUDA1cXk0akpkdGEvTTkyS1EzdnY4L25LaTRySy8wckxDNm1KNm10SGU3c0hONFpXMTlpSkxtVXAyd3FLeTBuS2E4aUpDZ3NMVjl1THE4cUt5d25LYTJvS3k0bEtDMHFMQzhxS3F3bktTMG9LbjdjREkxQUFBQUNINUJBRUFBQjhBTEFBQUFBQVVBQlFBQUFXRTRDZU9aR21lYUtxdUxLa29TUndKclhMY2g3WFFhNElmQWMrdWQ2QVVHSUhDUytOd01FNldYNlh3NnhBYXBzMkJpVUZvZnBJQ3dWTUszQ29WeHVEUVpCZ0loRWY1MEVWYzFyZ0tKU0lubVJrTURRMGRCeDBJQmhrWmZHVUFqWTBjT0F3VUNoWjlLUVlIaUlrWkc1WW9FQWNSb2hZYkFaNG5FSEFQcTZzVExhK3dzU1VoQURzPQ==

输出结果 :

origin string:a中你继续F@#$%^&*(BMDJFDoalsdkfjasl

result string:string(39) "A中你继续F@#$%^&*(BMDJFDOALSDKFJASL"

参考链接:https://www.cnblogs.com/wydchn/articles/4952205.html