Press "Enter" to skip to content

GBK编码PHP脚本导致语法错误(Zend Multibyte)

微薄上有同学问我:

     GBK环境下如下php代码:<?php echo("洪仁玕");?> 会引发php的语法错误,如何解决?

这个是因为, 在GBK环境下, "玕"的编码是"0xab 0x5c, 所以, 又是一个'5c'引发的问题..
一般来说, 还是建议大家用unicode作为代码文件的字符集, 如果要使用GBK, 再主动转换下.
不过, 就问题说问题, 如果你的脚本非要GBK编码, 那怎么避免这个问题呢?
从PHP5.3开始, PHP引入了Zend Multibyte来支持多字符集编码. 对于上面的代码, 我们修改如下:

<?php
declare(encoding="cp936");
echo("洪仁玕");
?>

然后, 在php.ini中配置:

mbstring.internal_encoding=cp936

或者通过如下命令运行PHP:

$php  -dmbstring.internal_encoding=cp936 test.php

这样, PHP就会以cp936编码方式来执行test.php了. 关于Zend Multibyte的更多信息请参看:PHP: what is --enable-zend-multibyte configure option for?, PHP declare
PS, 我在试验PHP5.4 RC1的时候, 发现了一个BUG, PHP 5.4 不能正确的转换GBK编码到UTF8编码, 不过现在我已经修复. 大家如果遇到这个问题, 请关注马上要发布的PHP5.4 RC2即可.. 谢谢

9 Comments

  1. Assignment writers
    Assignment writers July 10, 2018

    What simply happened is PHP parsers attempts to parse that document and makes tokens to start with, and gets mistook for the primary token class, because the parser for that adaptation of PHP can’t function admirably with \r characters. Happens that likewise, other undetectable Unicode characters may break the parser. The primary concern you just can’t comprehend the issue from the editorial manager except if you open Hex editor.

  2. L
    L February 6, 2012

    “PHP 5.4 不能正确的转换GBK编码到UTF8编码, 不过现在我已经修复. ”
    ‘朝里有人好办事’,看到这句很舒心。

  3. 荒野无灯
    荒野无灯 December 23, 2011

    嗯,以前看过gbk字符集下mysql_escape函数的一个0x5c引起的bug~~

  4. zhaiduo
    zhaiduo November 29, 2011

    我在用mysql_real_escape_string的时候也遇到5c问题,用mysql_escape_string就不会有5c问题。

  5. eve
    eve November 23, 2011

    我觉得是不是可以先用记事本打开代码,然后另存为utf-8编码,这样问题就解决了.您觉得呢

  6. taylor
    taylor November 23, 2011

    好诡异的bug啊
    最近碰到个因为转码的原因导致$_GET失败的问题,好诡异,最后是因为前段给的链接给urlencode了,纠结

  7. maifa
    maifa November 19, 2011

    我很想听下,又 一个 5C?
    又的解释。谢谢。

  8. cute
    cute November 18, 2011

    mb_internal_encoding(“CP936”);

Comments are closed.