“珅”字: 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;
}
?>
目前最优写法,感谢 @Zzzzzzzzz
$str = '和珅虽是奸臣|为什么被 GBK 歧视';
mb_regex_encoding ('GB2312');
$ss = mb_split('\|', $str );
print_r($ss);
1
moro 2015-08-27 16:57:53 +08:00
为什么要用 GBK..
|
3
lululau 2015-08-27 17:03:56 +08:00
打脸: echo 和珅 | iconv -t GBK | iconv -f GBK
|
4
lululau 2015-08-27 17:04:20 +08:00
我知道 LZ 要说的是 GB2312
|
5
hanbing OP @lululau 打脸前先测试下, GBK 用“|” 做 explode ,试试 OK ?
不是简体繁体的问题,是“|”符号 |
6
Zzzzzzzzz 2015-08-27 17:28:52 +08:00
珅在 gb 系列里是\xab\x7c, \x7c 就是|, 你可以用 mb_split ('\|', $str );
|
7
abelyao 2015-08-27 17:32:49 +08:00
用 explode 来分割中文本来就有危险…
|
8
wesley 2015-08-27 17:35:16 +08:00
用 mb_开头的函数来处理
|
9
aprikyblue 2015-08-27 17:45:42 +08:00
把分隔符改用多个字符, length>=2byte
|
10
letitbesqzr 2015-08-27 17:46:29 +08:00
卧槽,头像和我好像
|
12
hanbing OP @letitbesqzr - -!
|
13
xfspace 2015-08-27 17:51:30 +08:00 via Android
@letitbesqzr 我日。。。我还以为是你
|
14
letitbesqzr 2015-08-27 17:54:49 +08:00
@xfspace 哈哈,我背景红色的 还改小了点,适合一些网站 剪裁成圆形
|
16
aprikyblue 2015-08-27 18:34:56 +08:00
mb_ 系列应该是正确做法
不过试了下, mb_regex_encoding ('GBK')报错,只能 GB2312 |
17
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 ); ``` |
18
caola 2015-08-27 20:31:50 +08:00
在 php7 下貌似没有这样的问题了
|
19
realpg 2015-08-27 20:37:07 +08:00
我怎么感觉楼主的问题跟 GBK 半毛钱的关系都没有……
明明是用非 mb 的方法处理 mb 导致的 |
20
breeswish 2015-08-27 22:40:17 +08:00
就是应该使用 mb_ 系列函数…
以及, mb_split 使用的是 mb_regex_encoding 函数所指定的编码,所以直接用 mb_split 当然是不行的..要先调用 mb_regex_encoding 设置为 GB2312/GBK |
21
coffeecat 2015-08-27 22:51:42 +08:00
转码以后你会看到 “珅 ”的一半跟“ |” 是一样的,分隔符不能这么用的,你换个就行了。。。
|
22
lululau 2015-08-27 22:52:15 +08:00 via Android
我错了,我不懂这世上最好的语言,不了解 PHP 的多字节字符串处理是什么样的,我也不该瞎举例子。
我只想问下 LZ , GBK 里没珅 |
23
lululau 2015-08-27 22:53:21 +08:00 via Android
字的话,你的那个 GBK 编码的 PHP 代码里是怎么有个 shen 字的。。。。
|
25
21grams 2015-08-28 13:51:17 +08:00
GBK 里怎么可能没有珅,简直是扯淡
|