V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hanbing
V2EX  ›  PHP

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

  •  
  •   hanbing · 2015-08-27 16:50:18 +08:00 · 5076 次点击
    这是一个创建于 3163 天前的主题,其中的信息可能已经有所发展或是发生改变。

    “珅”字: 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;
    }
    ?>
    
    第 1 条附言  ·  2015-08-27 17:23:21 +08:00
    “珅”字: GBK 不认得(字库里应该没有这个字)
    请无视以上这行~(这里失误!)

    关键是“珅”和“|”一起 explode 分割问题
    第 2 条附言  ·  2015-08-28 09:03:26 +08:00

    目前最优写法,感谢 @Zzzzzzzzz

    $str = '和珅虽是奸臣|为什么被 GBK 歧视';
    mb_regex_encoding  ('GB2312');
    $ss = mb_split('\|', $str );
    print_r($ss);
    
    25 条回复    2015-08-28 13:51:17 +08:00
    moro
        1
    moro  
       2015-08-27 16:57:53 +08:00
    为什么要用 GBK..
    hanbing
        2
    hanbing  
    OP
       2015-08-27 17:01:21 +08:00
    @moro 历史遗留问题呗
    lululau
        3
    lululau  
       2015-08-27 17:03:56 +08:00
    打脸: echo 和珅 | iconv -t GBK | iconv -f GBK
    lululau
        4
    lululau  
       2015-08-27 17:04:20 +08:00
    我知道 LZ 要说的是 GB2312
    hanbing
        5
    hanbing  
    OP
       2015-08-27 17:19:24 +08:00
    @lululau 打脸前先测试下, GBK 用“|” 做 explode ,试试 OK ?
    不是简体繁体的问题,是“|”符号
    Zzzzzzzzz
        6
    Zzzzzzzzz  
       2015-08-27 17:28:52 +08:00
    珅在 gb 系列里是\xab\x7c, \x7c 就是|, 你可以用 mb_split ('\|', $str );
    abelyao
        7
    abelyao  
       2015-08-27 17:32:49 +08:00
    用 explode 来分割中文本来就有危险…
    wesley
        8
    wesley  
       2015-08-27 17:35:16 +08:00
    用 mb_开头的函数来处理
    aprikyblue
        9
    aprikyblue  
       2015-08-27 17:45:42 +08:00
    把分隔符改用多个字符, length>=2byte
    letitbesqzr
        10
    letitbesqzr  
       2015-08-27 17:46:29 +08:00
    卧槽,头像和我好像
    hanbing
        11
    hanbing  
    OP
       2015-08-27 17:50:42 +08:00
    @Zzzzzzzzz 都存在\x7c, mb_split 切割测试后同样问题,珅\xab\x7c 也会被切割
    hanbing
        12
    hanbing  
    OP
       2015-08-27 17:51:25 +08:00
    xfspace
        13
    xfspace  
       2015-08-27 17:51:30 +08:00 via Android
    @letitbesqzr 我日。。。我还以为是你
    letitbesqzr
        14
    letitbesqzr  
       2015-08-27 17:54:49 +08:00
    @xfspace 哈哈,我背景红色的 还改小了点,适合一些网站 剪裁成圆形
    Zzzzzzzzz
        15
    Zzzzzzzzz  
       2015-08-27 17:54:57 +08:00
    @hanbing mb_split 之前先 mb_regex_encoding ('GBK');一下看看
    aprikyblue
        16
    aprikyblue  
       2015-08-27 18:34:56 +08:00
    mb_ 系列应该是正确做法

    不过试了下, mb_regex_encoding ('GBK')报错,只能 GB2312
    Hashell
        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 );


    ```
    caola
        18
    caola  
       2015-08-27 20:31:50 +08:00
    在 php7 下貌似没有这样的问题了
    realpg
        19
    realpg  
       2015-08-27 20:37:07 +08:00
    我怎么感觉楼主的问题跟 GBK 半毛钱的关系都没有……
    明明是用非 mb 的方法处理 mb 导致的
    breeswish
        20
    breeswish  
       2015-08-27 22:40:17 +08:00
    就是应该使用 mb_ 系列函数…
    以及, mb_split 使用的是 mb_regex_encoding 函数所指定的编码,所以直接用 mb_split 当然是不行的..要先调用 mb_regex_encoding 设置为 GB2312/GBK
    coffeecat
        21
    coffeecat  
       2015-08-27 22:51:42 +08:00
    转码以后你会看到 “珅 ”的一半跟“ |” 是一样的,分隔符不能这么用的,你换个就行了。。。
    lululau
        22
    lululau  
       2015-08-27 22:52:15 +08:00 via Android
    我错了,我不懂这世上最好的语言,不了解 PHP 的多字节字符串处理是什么样的,我也不该瞎举例子。


    我只想问下 LZ , GBK 里没珅
    lululau
        23
    lululau  
       2015-08-27 22:53:21 +08:00 via Android
    字的话,你的那个 GBK 编码的 PHP 代码里是怎么有个 shen 字的。。。。
    hanbing
        24
    hanbing  
    OP
       2015-08-28 09:07:04 +08:00
    @lululau 数据库里序列化存着大量这类坑爹信息的,都是历史问题~
    21grams
        25
    21grams  
       2015-08-28 13:51:17 +08:00
    GBK 里怎么可能没有珅,简直是扯淡
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1114 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:52 · PVG 06:52 · LAX 15:52 · JFK 18:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.