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

本文介绍如何在PHP中编写函数,以解决在非中文系统服务器上使用strtolower()和strtoupper()可能导致的中文乱码问题,通过逐字符处理并利用ASCII码判断实现Unicode字符串大小写转换。
摘要由CSDN通过智能技术生成

前言

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值