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

urldencode 函数怎么解码 urlencode 编码的 GB2312 字符集的文本。

  •  
  •   nfa5 · 2019-04-27 20:21:03 +08:00 · 5114 次点击
    这是一个创建于 1796 天前的主题,其中的信息可能已经有所发展或是发生改变。
    文本先转换为 gb2312 的字符集后,再用 urlencode 编码。编码后的值用 urldecode 解码返回为 null 十分蛋疼。
    utf-8 文本编码后的可以直接解码,但 gbk 的解不了。

    搜遍互联网也没发现有人遇到同样的问题。。。。
    17 条回复    2019-04-28 14:59:36 +08:00
    WordTian
        1
    WordTian  
       2019-04-27 20:40:14 +08:00 via Android
    urldecode 一般只针对 ascii 码表的 0 - 127 做转换吧
    gbk 的编码就不在这个范围内,怎么解?
    nfa5
        2
    nfa5  
    OP
       2019-04-27 20:54:51 +08:00
    @WordTian 参考下这个:

    URLEncode:是指针对网页 url 中的中文字符的一种编码转化方式,最常见的就是 Baidu、Google 等搜索引擎中输入中文查询时候,生成经过 Encode 过的网页 URL。
    URLEncode 的方式一般有两种,一种是传统的基于 GB2312 的 Encode ( Baidu、Yisou 等使用),另一种是基于 UTF-8 的 Encode ( Google、Yahoo 等使用)。

    URLdecode:就是将 url 编码后的字符串还原成未编码的样子。


    本工具分别实现两种方式的 Encode 与 Decode:

    中文 -> GB2312 的 Encode -> %D6%D0%CE%C4

    中文 -> UTF-8 的 Encode -> %E4%B8%AD%E6%96%87




    既然能对不同编码的字符 encode 为不同的结果,为啥只能对 utf-8 的结果进行解码,gbk 的怎么办?怎么解回来。
    nfa5
        3
    nfa5  
    OP
       2019-04-27 20:56:48 +08:00
    而且我看到别人的在线工具可以实现 gbk 的解码。参考: http://tool.what21.com/url.html
    chinvo
        4
    chinvo  
       2019-04-27 20:57:50 +08:00
    @nfa5 #2 帮你搜索了一下,没发现有内置函数支持

    不过可以把 %xx 两两一组,十六进制按 GBK 码转换回汉字

    这个估计要自己实现,或者找找有没有第三方的包
    7sDream
        5
    7sDream  
       2019-04-27 21:12:26 +08:00
    https://docs.python.org/3/library/urllib.parse.html#urllib.parse.unquote

    python 的 unquote 支持 encoding 参数。

    PHP 的话,如果自带函数不支持,估计要自己实现了。
    WordTian
        6
    WordTian  
       2019-04-27 21:24:50 +08:00
    @nfa5 突然想起来,在使用 URLEncode、URLdecode 的时候,一般是可以指定字符集的
    比如 java 的 URLDecoder.decode(String, "UTF-8"),但是通常来说都默认用的 utf-8,用 gbk2312 的很少
    估计你用的那个解码工具也是默认指定的 UTF-8
    你自己写一个或者找一个字符集是 gbk2312 的解码工具就好了
    Northxw
        7
    Northxw  
       2019-04-27 21:48:00 +08:00
    纯真的我进来后发现是 PHP, 但是不能空手来啊,那我就水一波经验吧...
    nfroot
        8
    nfroot  
       2019-04-27 22:21:21 +08:00 via Android
    @Northxw 这个站发帖才可能涨积分,回帖全是扣积分的
    Northxw
        9
    Northxw  
       2019-04-27 22:44:10 +08:00
    @nfroot 呸,你揍开,能不能让我骗骗自己,良心嘞
    ysc3839
        10
    ysc3839  
       2019-04-27 22:59:11 +08:00
    https://www.php.net/manual/en/function.urldecode.php
    翻了一下 PHP 的 manual,并没有说会返回 null。所以这是 PHP 的 bug ?或者是文档有错误?
    nfa5
        11
    nfa5  
    OP
       2019-04-27 23:04:51 +08:00
    @chinvo 是的呢,找不到现成的函数,网上也没别人写的相关函数或类参考,看来还是得自己造了
    nfa5
        12
    nfa5  
    OP
       2019-04-27 23:05:32 +08:00
    @WordTian 客户要实现这个也是没办法
    nfa5
        13
    nfa5  
    OP
       2019-04-27 23:08:03 +08:00
    @ysc3839 不知道呢,php 低版本就是返回 null 换高版本的就直接报这行错误。
    ysc3839
        14
    ysc3839  
       2019-04-27 23:54:43 +08:00
    @nfa5 哪行错误?
    master
        15
    master  
       2019-04-28 02:07:12 +08:00
    owt5008137
        16
    owt5008137  
       2019-04-28 08:44:14 +08:00 via Android
    解完当做二进制 buffer,再 decode 一下不就好了么
    nfa5
        17
    nfa5  
    OP
       2019-04-28 14:59:36 +08:00
    @master 这个可以,感谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4053 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:18 · PVG 18:18 · LAX 03:18 · JFK 06:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.