- 本文地址: https://www.laruence.com/2009/11/16/1147.html
- 转载请注明出处
今天有朋友提到一个问题, 类似如下的字符串(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号索引对应的数组就是结果词的数组了..
[…] 本文地址: http://www.laruence.com/2009/11/16/1147.html […]
@关注着 1,查编码表 2,用16位编辑器, 3,在php中使用unpack, 4, 在js中使用charCodeAt …. 等等等等
弱弱的问一句:如何得到汉字的编码,呵呵
我觉得还是utf-8比较靠谱一点
吼吼,可以把分割符换了,例如:”>|<“,即用3个字符来分隔
如果不是gbk,倒可以使用mb_split来分割。
可惜mb的正则库只接受gb2312,不接受cp936即gbk.
UTF8也能直接使用。这时就体现出UTF8的好处了。。
还是第一种方法有通用性,第二种方法除了中文外要考虑其他字符太多。
@simaopig …你的头像双人照…..
GBK编码:0×8040-0xffff,
正则:[\\\\x80-\\\\xff][\\\\x40-\\\\xff]+
这样的组合就是前两位的80-ff结合后两位40-ff之间的所有字符,+表示出现一次或多次,贪婪模式,所以就是按非汉字分隔
赞,相当帅了,鸟哥,我爱死你了。
用了第一种方法 谢谢鸟哥