V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
hanbing
V2EX  ›  PHP

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

  •  
  •   hanbing · Aug 27, 2015 · 5926 views
    This topic created in 3903 days ago, the information mentioned may be changed or developed.

    “珅”字: 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;
    }
    ?>
    
    Supplement 1  ·  Aug 27, 2015
    “珅”字: GBK 不认得(字库里应该没有这个字)
    请无视以上这行~(这里失误!)

    关键是“珅”和“|”一起 explode 分割问题
    Supplement 2  ·  Aug 28, 2015

    目前最优写法,感谢 @Zzzzzzzzz

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

    不过试了下, mb_regex_encoding ('GBK')报错,只能 GB2312
    Hashell
        17
    Hashell  
       Aug 27, 2015
    我觉得,即使是历史问题,也要转为 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  
       Aug 27, 2015
    在 php7 下貌似没有这样的问题了
    realpg
        19
    realpg  
    PRO
       Aug 27, 2015
    我怎么感觉楼主的问题跟 GBK 半毛钱的关系都没有……
    明明是用非 mb 的方法处理 mb 导致的
    breeswish
        20
    breeswish  
       Aug 27, 2015
    就是应该使用 mb_ 系列函数…
    以及, mb_split 使用的是 mb_regex_encoding 函数所指定的编码,所以直接用 mb_split 当然是不行的..要先调用 mb_regex_encoding 设置为 GB2312/GBK
    coffeecat
        21
    coffeecat  
       Aug 27, 2015
    转码以后你会看到 “珅 ”的一半跟“ |” 是一样的,分隔符不能这么用的,你换个就行了。。。
    lululau
        22
    lululau  
       Aug 27, 2015 via Android
    我错了,我不懂这世上最好的语言,不了解 PHP 的多字节字符串处理是什么样的,我也不该瞎举例子。


    我只想问下 LZ , GBK 里没珅
    lululau
        23
    lululau  
       Aug 27, 2015 via Android
    字的话,你的那个 GBK 编码的 PHP 代码里是怎么有个 shen 字的。。。。
    hanbing
        24
    hanbing  
    OP
       Aug 28, 2015
    @lululau 数据库里序列化存着大量这类坑爹信息的,都是历史问题~
    21grams
        25
    21grams  
       Aug 28, 2015
    GBK 里怎么可能没有珅,简直是扯淡
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2826 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 85ms · UTC 07:31 · PVG 15:31 · LAX 00:31 · JFK 03:31
    ♥ Do have faith in what you're doing.