Press "Enter" to skip to content

分割GBK中文遭遇乱码的解决

今天有朋友提到一个问题, 类似如下的字符串(GBK), explode不能得到正确结果:

$result = explode("|", "滕华弢|海青"); //(插一句, 蜗居最近很火啊)

究其原因, 对于”弢”字(读tao,不认识没关系,我也不认识), 因为他的GBK编码值为: 8f7c, 不巧的是, “|”的ASCII值也是7c.

这样的问题, 还有很多 : 因为GBK编码的编码范围是: 0x8140-0xfefe, 所以, 理论上来说, 任何低字节是7c的字都会有这个问题, 比如:

倈(827c), 億(837c), 眧(b17c), 鍇(e57c).......等等等等.

对于这样的情况,

第一, 可以采用转码到utf8, 然后explode, 再转回来, 这是比较麻烦的方法.

第二, 我们可以采用正则拿"匹配出"来代替"分离出":
    preg_match_all("/([\x81-\xfe][\x40-\xfe])+/", $gbk_str, $matches);//写死编码值

这样, $matches中0号索引对应的数组就是结果词的数组了..

10 Comments

  1. 雪候鸟
    雪候鸟 2009-11-20

    @关注着 1,查编码表 2,用16位编辑器, 3,在php中使用unpack, 4, 在js中使用charCodeAt …. 等等等等

  2. 关注者
    关注者 2009-11-19

    弱弱的问一句:如何得到汉字的编码,呵呵

  3. gently
    gently 2009-11-17

    吼吼,可以把分割符换了,例如:”>|<“,即用3个字符来分隔

  4. PeterYu
    PeterYu 2009-11-17

    如果不是gbk,倒可以使用mb_split来分割。
    可惜mb的正则库只接受gb2312,不接受cp936即gbk.
    UTF8也能直接使用。这时就体现出UTF8的好处了。。

  5. cody
    cody 2009-11-16

    还是第一种方法有通用性,第二种方法除了中文外要考虑其他字符太多。

  6. simaopig
    simaopig 2009-11-16

    GBK编码:0×8040-0xffff,
    正则:[\\\\x80-\\\\xff][\\\\x40-\\\\xff]+
    这样的组合就是前两位的80-ff结合后两位40-ff之间的所有字符,+表示出现一次或多次,贪婪模式,所以就是按非汉字分隔
    赞,相当帅了,鸟哥,我爱死你了。

  7. zorro
    zorro 2009-11-16

    用了第一种方法 谢谢鸟哥

Leave a Reply

Your email address will not be published. Required fields are marked *