strtolower()和strtoupper()中文乱码问题

这个问题来自腾讯的一道笔试题:
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();来查看;

推荐使用该扩展,不仅对中文适用,对其他语言也适用。


string ucwords ( string $str )将每个单词的首字母大写
string ucfirst ( string $str )只是将字符串的首字母大写而已

<?php
//注意world的区别
$str = "hello world";
var_dump(ucfirst($str));//string(11) "Hello world"
var_dump(ucwords($str));//string(11) "Hello World"
var_dump(mb_convert_case($str,MB_CASE_TITLE,'UTF-8'));//string(11) "Hello World"
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值