zoukankan      html  css  js  c++  java
  • Python urlencode与urldecode的使用

    需求:有时候我们GET方法参数的特殊符号,如果没有编码就会被截取,这里时候,就需要客户端需要urlencode,服务端:urldecode来进行处理
    注意:此代码来源Tornado源码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import typing
    import urllib.parse
    from typing import Union, Optional
    
    _UTF8_TYPES = (bytes, type(None))
    unicode_type = str
    
    @typing.overload
    def utf8(value: bytes) -> bytes:
        pass
    
    @typing.overload  # noqa: F811
    def utf8(value: str) -> bytes:
        pass
    
    @typing.overload  # noqa: F811
    def utf8(value: None) -> None:
        pass
    
    def utf8(value: Union[None, str, bytes], code_type='utf-8') -> Optional[bytes]:  # noqa: F811
        """ utf-8编码"""
        if isinstance(value, _UTF8_TYPES):
            return value
        if not isinstance(value, unicode_type):
            raise TypeError("Expected bytes, unicode, or None; got %r" % type(value))
        return value.encode(code_type)
    
    @typing.overload
    def to_unicode(value: str) -> str:
        pass
    
    @typing.overload  # noqa: F811
    def to_unicode(value: bytes) -> str:
        pass
    
    @typing.overload  # noqa: F811
    def to_unicode(value: None) -> None:
        pass
    
    _TO_UNICODE_TYPES = (unicode_type, type(None))
    
    def to_unicode(value: Union[None, str, bytes], code_type='utf-8') -> Optional[str]:  # noqa: F811
        """字节类型转为字符串"""
        if isinstance(value, _TO_UNICODE_TYPES):
            return value
        if not isinstance(value, bytes):
            raise TypeError("Expected bytes, unicode, or None; got %r" % type(value))
        return value.decode(code_type)
    
    def url_escape(value: Union[str, bytes], plus: bool = True) -> str:
        """
            url编码的功能
            plus=True 表示空格用+替换
            plus=False 表示空格用%20替换
        """
        quote = urllib.parse.quote_plus if plus else urllib.parse.quote
        return quote(utf8(value))
    
    def url_unescape(  # noqa: F811
            value: Union[str, bytes], encoding: Optional[str] = "utf-8", plus: bool = True
    ) -> Union[str, bytes]:
        """
            url解码的功能
            plus=True 表示空格用+替换
            plus=False 表示空格用%20替换
        """
        if encoding is None:
            if plus:
                # 将字节类型转为字符串类型,并且替换+号为空格
                value = to_unicode(value).replace("+", " ")
            return urllib.parse.unquote_to_bytes(value)
        else:
            unquote = urllib.parse.unquote_plus if plus else urllib.parse.unquote
            return unquote(to_unicode(value), encoding=encoding)
    
    if __name__ == '__main__':
        url_escape_ret = url_escape("username=test&password=admin&content=中国  人", plus=False)
        url_unescape_ret = url_unescape(url_escape_ret, plus=False)
        print('编码', url_escape_ret, type(url_escape_ret))
        print('解码', url_unescape_ret, type(url_unescape_ret))

    运行结果

    编码 username%3Dtest%26password%3Dadmin%26content%3D%E4%B8%AD%E5%9B%BD%20%20%E4%BA%BA <class 'str'>
    解码 username=test&password=admin&content=中国  人 <class 'str'>
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/ygbh/p/14023975.html
Copyright © 2011-2022 走看看