eg:sdfgERx中国dfSXcvr哈Sg----转换成sdfgerx中国dfsxcvr哈sg1:使用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

解决方案 »

  1.   

    正则+eval
    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,导致中文出错
      

  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个字母存在大小写转换,所以需要在转换时判断范围
      

  5.   

    请看2楼.按理说gbk的编码和ASC||的编码不应该有重合的地方,可是
    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 系列操作系统,微软不会犯这种低级错误。因为双字节系统是他提出的
      

  8.   

    看来是平台相关,因为我们通常用的都是中文的windows,我#6结果是utf-8 linux下的结果,LZ你的第一个参考链接已经说明问题了,你是不知道解决方案吧,mb_strtolower算一个,不过基本这个函数在用时,实参都保证是ascii码的吧,至少这种中英混合的情况老实说我还没这么用过。
      

  9.   

    这个问题不错,很多开发人员都是windows下开发,而公司服务器大多都是linux,都可以注意下这个问题。