zoukankan      html  css  js  c++  java
  • urlencode遇到中文编码问题

    urlencode并不会改变输入的编码格式, 默认会将中文输出为 gbk 编码, 类似的, quote 会对中文进行 gbk 编码

    不过, 当遇到嵌套多层的字典时, 问题就来了, 中文会被 utf8 编码, 原因是, 除去最外层的里面整个字典会被认为是一个字符串, 当然, 没有错.

    问题是, 内层字典中的中文键值会被转换成utf8格式.

    >>> from urllib import urlencode
    
    >>> urlencode({"n":"你还"})
    'n=%E4%BD%A0%E8%BF%98'
    >>>
    输出正常, 岁月静好
    
    >>> urlencode({"a":{"n":"你还"}})
    'a=%7B%27n%27%3A+%27%5Cxe4%5Cxbd%5Cxa0%5Cxe8%5Cxbf%5Cx98%27%7D'
    问题来了, 某些接口需要 gbk 编码, 怎么破?

    现在, 假设有个很奇葩的接口, 它需要所有的引号都是双引号%22, urlencode 默认输出单引号%27, 所有的中文都是gbk.

    有个说法, 你可以先 quote 再 urlencode, 但是, 有个潜在的坑是, quote 生成的 % 会被urlencode 翻译成 %25

    >>> from urllib import quote
    >>> quote("你还")
    '%E4%BD%A0%E8%BF%98'
    正常的输出, 现世安稳
    
    >>> urlencode({"a":{"n":quote("你还")}})
    'a=%7B%27n%27%3A+%27%25E4%25BD%25A0%25E8%25BF%2598%27%7D'
    迷之%25, 其实就是 %

    比较简单粗暴的做法

    >>> urlencode({"a":{"n":quote("你还")}}).replace("25", "").replace("27", "22")
    'a=%7B%22n%22%3A%22%E4%BD%A0%E8%BF%98%22%7D'

    Python 3 就不会有这个问题, 除了还是把双引号搞成了单引号

    >>> from urllib.parse import urlencode
    >>> urlencode({"a":{"n":"你还"}})
    'a=%7B%27n%27%3A+%27%E4%BD%A0%E8%BF%98%27%7D'
  • 相关阅读:
    锐捷交换机密码恢复
    adobe cs3系列产品官方帮助网页(中文)
    网页设计视频教程
    锐捷交换机、路由器配置手册
    WINPE下如何直接删除联想隐藏分区?
    IWMS实现频道页面的方法
    SATA、SCSI、SAS区别与特点
    自定义系统必备
    自己写的Web服务器
    尝试MVP模式
  • 原文地址:https://www.cnblogs.com/senjougahara/p/6203363.html
Copyright © 2011-2022 走看看