设为首页 收藏本站
查看: 293|回复: 0

[经验分享] php中的strtolower

[复制链接]

尚未签到

发表于 2017-3-21 11:39:07 | 显示全部楼层 |阅读模式
以下是我从php/ext/standard/string.c中找到的strtolower()函数源码:
PHPAPI char *php_strtolower(char *s, size_t len)
{
unsigned char *c, *e;
c = s;
e = c+len;
while (c < e) {
*c = tolower(*c);
c++;
}
return s;
}

strtolower()函数会调用glibc中的tolower()函数将每个字符进行转换,但是这个tolower()函数会跟本地化环境有关系。
比如一次编程,在我本机上(windows中文)对"越狱A"进行strtolower()转换,得到的是"越狱a",但是在某台linux机器上执行转换,得到的却是一堆乱码+"a",显然这个函数也对中文字符进行了转换。
这个bug不是strtolower()的问题,而是tolower的问题,他会根据你的本地化进行转换,和本地化设置有关的几个变量是:
LANG
LC_*(LC_CTYPE, LC_NUMERIC,等等)
LC_ALL
从上到下优先级越来越高。也就是如果你设定了LC_ALL=zh_CN.gb2312,那么其他的再怎么设定都是徒劳。变量等号后面的值遵循“语言[_地域[.字符集]]”的格式。
LANG的设定,一般在/etc/sysconfig/i18n中,但是有些版本在/etc/rc.sysinit中也设定LC_ALL或者LC_CTYPE等来覆盖/etc/sysconfig/i18n中的变量
知道strtolower()存在的问题,我们就应该着手解决,这里有几种解决方式:
1. 这是strlocale()然后进行转换:
strlocale(LC_ALL, 'zh_CN.gb2312');
strtolower($text);
实验后发现,这个居然不行,疑惑...
2. 如果就是为了转换英文字母,那么手动转换也可以:
引用

/**
* 为了避免出现因为系统字符集不同而而出现的将某些非英文字母也进行大小写转换,
* 从而出现乱码的问题
*
* @param string $value
* @return string
*/
function estrtolower($value){
return str_replace(
array('A','B','C','D','E','F','G','H','I','J',
'K','L','M','N','O','P','Q','R','S','T','U',
'V','W','X','Y','Z'),
array('a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t','u',
'v','w','x','y','z'),
$value
);
}

我没试过上面这种方法通不通用(因为那个环境比较特殊,身边不好找),但我估计这个办法也不行,我目前使用的方法是
urldecode(strtolower(urlencode($value)));
等几天看看这样是不是会有问题...
珍贵参考:
locale 详解:http://www.chinaunix.net/jh/6/834459.html

但是这里的问题不知道谁能说得更清楚些?我他出现的那个情况的原因还有点疑惑
http://bbs.chinaunix.net/thread-1283161-1-1.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-353005-1-1.html 上篇帖子: PHP学习开始——环境配置 下篇帖子: PHP项目感受
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表