msgbartop
PHP源码分析,Zend引擎分析,Web相关技术研究,Web技术分享–左手代码 右手诗
msgbarbottom

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

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

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

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

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

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

对于这样的情况,

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

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

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

Related Posts:

Tags: , ,

Reader's Comments

  1. |

    用了第一种方法 谢谢鸟哥

  2. |

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

  3. |

    @simaopig …你的头像双人照…..

  4. |

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

  5. |

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

  6. |

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

  7. |

    我觉得还是utf-8比较靠谱一点

  8. |

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

  9. |

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

Leave a Comment

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word