hanbing
V2EX  ›  PHP

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

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

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


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