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

来源:互联网 发布:gson如何解析json数组 编辑:程序博客网 时间:2024/05/21 10:33

最近看到一个比较有意思的问题,如题。
首先查看php函数的实现源码,以strtolower为例,源码如下

c = (unsigned char *)s;e = c+len;// 遍历s,逐个变为小写while (c < e) {  *c = tolower(*c);  c++;}return s;

tolower函数

int tolower(int c)  {      if ((c >= 'A') && (c <= 'Z'))          return c + ('a' - 'A');      return c;  } 

可见在转换某些区分大小写的汉字编码(如utf8)的时候会导致问题

具体解法如下:

function str_toupper($str){    if(!is_string($str))    {        return $str;    }    $strOut = '';    $strArr = str_split($str,1);    foreach($strArr as $val)    {        if(ord($val) >= ord('a') && ord($val) <= ord('z'))        {               $strAsc = ord($val);            $strAsc += ord('A') - ord('a');             $val = chr($strAsc);        }        $strOut .= $val;    }    return $strOut;}
function str_tolower($str){    if(!is_string($str))    {        return $str;    }     $strOut = '';    $strArr = str_split($str,1);    foreach($strArr as $val)    {        if(ord($val) >= ord('A') && ord($val) <= ord('Z'))        {               $strAsc = ord($val);            $strAsc += ord('a') - ord('A');             $val = chr($strAsc);        }        $strOut .= $val;    }    return $strOut;}

实现大小写转换仍用变换asc II码来实现,在遍历的时候替换成str_split,该字符分割函数是按字节来分割,汉字会被分成3个字节,每个字节的asc II码都不属于英文字符,不会被转换。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 深蹲可以瘦哪里 深蹲的坏处 如何练习深蹲 蹲起的正确做法 怎么练习深蹲 女生深蹲可以瘦腿吗 无负重深蹲 男人练深蹲有什么好处 徒手深蹲的好处 蹲起的正确做法图片 什么是深蹲 深蹲的标准动作 深蹲多少公斤合格 深蹲姿势 做深蹲的正确姿势 深蹲架 如何练深蹲 标准深蹲 健身深蹲标准动作 史密斯深蹲 深蹲锻炼哪里的肌肉 深蹲多少个一组 单腿深蹲 深蹲减肥 深蹲训练 深蹲腿会不会变粗 做蹲起有什么好处 蹲起有什么好处 做深蹲能减肥吗 深蹲能不能瘦腿 深蹲有什么用 做深蹲能瘦腿吗 蹲起能瘦腿吗 做蹲起能瘦腿吗 深蹲瘦腿吗 深蹲能减大腿吗 做深蹲 深蹲瘦哪里 深蹲能瘦大腿吗 深蹲能瘦腿吗 深蹲瘦大腿吗