php中的strtolower

以下是我从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);

[color=red]实验后发现,这个居然不行,疑惑...[/color]

2. 如果就是为了转换英文字母,那么手动转换也可以:

[quote]

/**
* 为了避免出现因为系统字符集不同而而出现的将某些非英文字母也进行大小写转换,
* 从而出现乱码的问题
*
* @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
);
}
[/quote]
我没试过上面这种方法通不通用(因为那个环境比较特殊,身边不好找),但我估计这个办法也不行,我目前使用的方法是
urldecode(strtolower(urlencode($value)));

等几天看看这样是不是会有问题...

珍贵参考:
[url=http://www.chinaunix.net/jh/6/834459.html]locale 详解[/url]:http://www.chinaunix.net/jh/6/834459.html


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值