和珅虽是奸臣但也不能被 GBK 看不起啊 - -!

2015-08-27 16:50:18 +08:00
 hanbing

“珅”字: GBK 不认得(字库里应该没有这个字),需要将字符串用“|” explode 分割为数组,有好的解决办法?

code 存储编码: GBK

以下是测试 code

<?php
$str = '和珅虽是奸臣|为什么被 GBK 歧视';
$arr = explode ('|',$str );
print_r ($arr );
?>

目前我们用的办法: GBK 先转 UTF8 再转回来,感觉比较麻烦,有神马神秘简单的方法没?

<?php
$str = '和珅虽是奸臣|为什么被 GBK 歧视';
$str = iconv ('GBK', 'UTF-8', $str );
$arr = explode ('|',$str );

print_r (utf_gbk ($arr ));

function utf_gbk ($data ){
    if (is_array ($data )){
        foreach ($data as $k=>$v ){
            $result[$k] = utf_gbk ($v );
        }
    }else{
        $result =  iconv ("UTF-8", "GBK//IGNORE", $data );
    }
    return $result;
}
?>
5079 次点击
所在节点    PHP
25 条回复
moro
2015-08-27 16:57:53 +08:00
为什么要用 GBK..
hanbing
2015-08-27 17:01:21 +08:00
@moro 历史遗留问题呗
lululau
2015-08-27 17:03:56 +08:00
打脸: echo 和珅 | iconv -t GBK | iconv -f GBK
lululau
2015-08-27 17:04:20 +08:00
我知道 LZ 要说的是 GB2312
hanbing
2015-08-27 17:19:24 +08:00
@lululau 打脸前先测试下, GBK 用“|” 做 explode ,试试 OK ?
不是简体繁体的问题,是“|”符号
Zzzzzzzzz
2015-08-27 17:28:52 +08:00
珅在 gb 系列里是\xab\x7c, \x7c 就是|, 你可以用 mb_split ('\|', $str );
abelyao
2015-08-27 17:32:49 +08:00
用 explode 来分割中文本来就有危险…
wesley
2015-08-27 17:35:16 +08:00
用 mb_开头的函数来处理
aprikyblue
2015-08-27 17:45:42 +08:00
把分隔符改用多个字符, length>=2byte
letitbesqzr
2015-08-27 17:46:29 +08:00
卧槽,头像和我好像
hanbing
2015-08-27 17:50:42 +08:00
@Zzzzzzzzz 都存在\x7c, mb_split 切割测试后同样问题,珅\xab\x7c 也会被切割
hanbing
2015-08-27 17:51:25 +08:00
xfspace
2015-08-27 17:51:30 +08:00
@letitbesqzr 我日。。。我还以为是你
letitbesqzr
2015-08-27 17:54:49 +08:00
@xfspace 哈哈,我背景红色的 还改小了点,适合一些网站 剪裁成圆形
Zzzzzzzzz
2015-08-27 17:54:57 +08:00
@hanbing mb_split 之前先 mb_regex_encoding ('GBK');一下看看
aprikyblue
2015-08-27 18:34:56 +08:00
mb_ 系列应该是正确做法

不过试了下, mb_regex_encoding ('GBK')报错,只能 GB2312
Hashell
2015-08-27 18:51:35 +08:00
我觉得,即使是历史问题,也要转为 UTF-8, 方便处理. 话说,为什么要自己写转化编码的函数啊?

```php

header ('Content-Type:text/html; charset=gbk');
$str = '和珅虽是奸臣|为什么被 GBK 歧视';

function convert ($str )
{
return array_map (function ($v ) {
return mb_convert_encoding ($v, 'CP936', 'UTF-8');
}, explode ('|', mb_convert_encoding ($str, 'UTF-8', 'CP936')));
}

$r = convert ($str );
var_dump ($r );


```
caola
2015-08-27 20:31:50 +08:00
在 php7 下貌似没有这样的问题了
realpg
2015-08-27 20:37:07 +08:00
我怎么感觉楼主的问题跟 GBK 半毛钱的关系都没有……
明明是用非 mb 的方法处理 mb 导致的
breeswish
2015-08-27 22:40:17 +08:00
就是应该使用 mb_ 系列函数…
以及, mb_split 使用的是 mb_regex_encoding 函数所指定的编码,所以直接用 mb_split 当然是不行的..要先调用 mb_regex_encoding 设置为 GB2312/GBK

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/216431

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX