1:使用strlower后会有乱码.
2:考虑使用正则替换,但是没有成功
参考:
http://orei11y.iteye.com/blog/297460
http://bbs.chinaunix.net/thread-1283161-1-1.html
http://blog.sina.com.cn/s/blog_544465b0010002pz.html
http://bbs.phpchina.com/thread-174046-1-1.html
10 个解决方案
#2
环境是gbk.
用PHP模拟生成的16进制字符串:
Ff旻:\x46\x66\x95\x46(\x46是F,\x66是f,\x95是中文的第一个字节,\x46是中文的第二个字符)
Ff昮:\x46\x66\x95\x66(\x46是F,\x66是f,\x95是中文的第一个字节,\x66是不应该转换的中文的第二个字符)
所以如果转换的话会把中文字符中的第二个字节\x46当做英文字符F给换成了f:\x66,导致中文出错
用PHP模拟生成的16进制字符串:
Ff旻:\x46\x66\x95\x46(\x46是F,\x66是f,\x95是中文的第一个字节,\x46是中文的第二个字符)
Ff昮:\x46\x66\x95\x66(\x46是F,\x66是f,\x95是中文的第一个字节,\x66是不应该转换的中文的第二个字符)
所以如果转换的话会把中文字符中的第二个字节\x46当做英文字符F给换成了f:\x66,导致中文出错
#3
这个也不行,我用str_replace替换F都会出错.
#4
$s = 'eg:sdfgERx中国dfSXcvr哈Sg----转换成sdfgerx中国dfsxcvr哈sg';
echo strtolower($s);
eg:sdfgerx中国dfsxcvr哈sg----转换成sdfgerx中国dfsxcvr哈sg
不知道你的 strlower 是什么函数
看了你给的链接,原来是某些 c 编译器出错了(tolower)
链接中的一些说法是错误的!
只有26个字母存在大小写转换,所以需要在转换时判断范围
echo strtolower($s);
eg:sdfgerx中国dfsxcvr哈sg----转换成sdfgerx中国dfsxcvr哈sg
不知道你的 strlower 是什么函数
看了你给的链接,原来是某些 c 编译器出错了(tolower)
链接中的一些说法是错误的!
只有26个字母存在大小写转换,所以需要在转换时判断范围
#5
请看2楼.按理说gbk的编码和ASC||的编码不应该有重合的地方,可是
中文 '旻'的第二个字节就是 \x46,转换成十进制即66,就是f
帖子 http://www.busfly.net/csdn/post/ascii-utf-8-unicode-gbk-gb2312.html
中说
这是为什么呢?
Ff旻: \x46\x66\x95\x46 (\x46是F,\x66是f,\x95是中文的第一个字节,\x46是中文的第二个字符)
模拟16进制的函数来自:http://www.mmcat.cn/2012/04/php-%E5%B0%86%E5%AD%97%E7%AC%A6%E5%8C%85%E6%8B%AC%E6%B1%89%E5%AD%97-%E8%BD%AC%E6%8D%A2%E6%88%9016%E8%BF%9B%E5%88%B6-apache-access-log-%E4%B8%AD%E6%96%87%E6%98%BE%E7%A4%BA16%E8%BF%9B%E5%88%B6/
中文 '旻'的第二个字节就是 \x46,转换成十进制即66,就是f
帖子 http://www.busfly.net/csdn/post/ascii-utf-8-unicode-gbk-gb2312.html
中说
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从 A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312-80*收录了7545个字符,用两个字节编码一个字符。每个字符最高位为0。GB2312-80编码简称国标码。
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。
这是为什么呢?
#6
测试了下,果然有问题,所以mb_那边会提供个函数是mb_strtolower,你可以试试
<?php
header("Content-type:text/html;charset=gbk");
$string = iconv("utf-8","gbk","Ff旻");//代码文件是utf-8,所以我这里需要iconv
echo strtolower($string);//ff昮
echo "<br/>";
echo mb_strtolower($string,"gbk");//ff旻
?>
#7
我 #4 给出的是我实际运行的结果,无论是 gbk 还是 utf-8 编码的,结果都一样
gbk 是在 gb2312 的基础上直接融入 big5 的结果。所以第二个字节是从 0x40 开始的,而 A 是 0x41
如果在处理时没有考虑到本地化语言时,出现这样的问题是很正常的,所以你搜索了一圈也就看到了本地化问题。
显然你使用的不是 window 系列操作系统,微软不会犯这种低级错误。因为双字节系统是他提出的
gbk 是在 gb2312 的基础上直接融入 big5 的结果。所以第二个字节是从 0x40 开始的,而 A 是 0x41
如果在处理时没有考虑到本地化语言时,出现这样的问题是很正常的,所以你搜索了一圈也就看到了本地化问题。
显然你使用的不是 window 系列操作系统,微软不会犯这种低级错误。因为双字节系统是他提出的
#8
真心没乱码
#9
看来是平台相关,因为我们通常用的都是中文的windows,我#6结果是utf-8 linux下的结果,LZ你的第一个参考链接已经说明问题了,你是不知道解决方案吧,mb_strtolower算一个,不过基本这个函数在用时,实参都保证是ascii码的吧,至少这种中英混合的情况老实说我还没这么用过。
#10
这个问题不错,很多开发人员都是windows下开发,而公司服务器大多都是linux,都可以注意下这个问题。
#1
正则+eval
http://codepad.org/IUH24Ra4
http://codepad.org/IUH24Ra4
#2
环境是gbk.
用PHP模拟生成的16进制字符串:
Ff旻:\x46\x66\x95\x46(\x46是F,\x66是f,\x95是中文的第一个字节,\x46是中文的第二个字符)
Ff昮:\x46\x66\x95\x66(\x46是F,\x66是f,\x95是中文的第一个字节,\x66是不应该转换的中文的第二个字符)
所以如果转换的话会把中文字符中的第二个字节\x46当做英文字符F给换成了f:\x66,导致中文出错
用PHP模拟生成的16进制字符串:
Ff旻:\x46\x66\x95\x46(\x46是F,\x66是f,\x95是中文的第一个字节,\x46是中文的第二个字符)
Ff昮:\x46\x66\x95\x66(\x46是F,\x66是f,\x95是中文的第一个字节,\x66是不应该转换的中文的第二个字符)
所以如果转换的话会把中文字符中的第二个字节\x46当做英文字符F给换成了f:\x66,导致中文出错
#3
这个也不行,我用str_replace替换F都会出错.
#4
$s = 'eg:sdfgERx中国dfSXcvr哈Sg----转换成sdfgerx中国dfsxcvr哈sg';
echo strtolower($s);
eg:sdfgerx中国dfsxcvr哈sg----转换成sdfgerx中国dfsxcvr哈sg
不知道你的 strlower 是什么函数
看了你给的链接,原来是某些 c 编译器出错了(tolower)
链接中的一些说法是错误的!
只有26个字母存在大小写转换,所以需要在转换时判断范围
echo strtolower($s);
eg:sdfgerx中国dfsxcvr哈sg----转换成sdfgerx中国dfsxcvr哈sg
不知道你的 strlower 是什么函数
看了你给的链接,原来是某些 c 编译器出错了(tolower)
链接中的一些说法是错误的!
只有26个字母存在大小写转换,所以需要在转换时判断范围
#5
请看2楼.按理说gbk的编码和ASC||的编码不应该有重合的地方,可是
中文 '旻'的第二个字节就是 \x46,转换成十进制即66,就是f
帖子 http://www.busfly.net/csdn/post/ascii-utf-8-unicode-gbk-gb2312.html
中说
这是为什么呢?
Ff旻: \x46\x66\x95\x46 (\x46是F,\x66是f,\x95是中文的第一个字节,\x46是中文的第二个字符)
模拟16进制的函数来自:http://www.mmcat.cn/2012/04/php-%E5%B0%86%E5%AD%97%E7%AC%A6%E5%8C%85%E6%8B%AC%E6%B1%89%E5%AD%97-%E8%BD%AC%E6%8D%A2%E6%88%9016%E8%BF%9B%E5%88%B6-apache-access-log-%E4%B8%AD%E6%96%87%E6%98%BE%E7%A4%BA16%E8%BF%9B%E5%88%B6/
中文 '旻'的第二个字节就是 \x46,转换成十进制即66,就是f
帖子 http://www.busfly.net/csdn/post/ascii-utf-8-unicode-gbk-gb2312.html
中说
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从 A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312-80*收录了7545个字符,用两个字节编码一个字符。每个字符最高位为0。GB2312-80编码简称国标码。
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。
这是为什么呢?
#6
测试了下,果然有问题,所以mb_那边会提供个函数是mb_strtolower,你可以试试
<?php
header("Content-type:text/html;charset=gbk");
$string = iconv("utf-8","gbk","Ff旻");//代码文件是utf-8,所以我这里需要iconv
echo strtolower($string);//ff昮
echo "<br/>";
echo mb_strtolower($string,"gbk");//ff旻
?>
#7
我 #4 给出的是我实际运行的结果,无论是 gbk 还是 utf-8 编码的,结果都一样
gbk 是在 gb2312 的基础上直接融入 big5 的结果。所以第二个字节是从 0x40 开始的,而 A 是 0x41
如果在处理时没有考虑到本地化语言时,出现这样的问题是很正常的,所以你搜索了一圈也就看到了本地化问题。
显然你使用的不是 window 系列操作系统,微软不会犯这种低级错误。因为双字节系统是他提出的
gbk 是在 gb2312 的基础上直接融入 big5 的结果。所以第二个字节是从 0x40 开始的,而 A 是 0x41
如果在处理时没有考虑到本地化语言时,出现这样的问题是很正常的,所以你搜索了一圈也就看到了本地化问题。
显然你使用的不是 window 系列操作系统,微软不会犯这种低级错误。因为双字节系统是他提出的
#8
真心没乱码
#9
看来是平台相关,因为我们通常用的都是中文的windows,我#6结果是utf-8 linux下的结果,LZ你的第一个参考链接已经说明问题了,你是不知道解决方案吧,mb_strtolower算一个,不过基本这个函数在用时,实参都保证是ascii码的吧,至少这种中英混合的情况老实说我还没这么用过。
#10
这个问题不错,很多开发人员都是windows下开发,而公司服务器大多都是linux,都可以注意下这个问题。