论坛首页 编程语言技术论坛

php中的strtolower

浏览 4226 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-19   最后修改:2008-12-19
PHP
以下是我从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
   发表时间:2008-12-19  
下来烟酒一下
0 请登录后投票
   发表时间:2008-12-19  
字符串转换?

可以使用万能的正则,无需为这种事情伤脑筋。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics