V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
unt
V2EX  ›  程序员

http s 接口返回内容中文乱码

  •  
  •   unt · 6 天前 · 1225 次点击
    https://tianqi.2345.com/t/wea_history/js/202311/55591_202311.js

    这个资源请求返回的内容中中文字符全是乱码的,但是浏览器端却能正常打开,一般浏览器不会给任何提示,还好大火狐给了,请问火狐之类的浏览器是怎么确定采用哪种编码方式的呢。

    我通过设置返回结果为 buffer 类型,拿到了 hex,我该怎么尝试来探测它的编码规则呢。
    8 条回复    2024-12-21 22:19:37 +08:00
    iikebug
        1
    iikebug  
       6 天前
    默认以 utf8 解码了,你指定一下响应编码类型就好了
    ldyisbest
        2
    ldyisbest  
       6 天前   ❤️ 1
    这段代码正常

    import requests

    headers = {
    'User-Agent': 'Mozilla/5.0'
    }

    resp = requests.get("https://tianqi.2345.com/t/wea_history/js/202311/55591_202311.js", headers=headers)
    print(resp.content.decode('gbk'))

    rekulas
        3
    rekulas  
       6 天前
    这个文件缺少编码指定,你开发默认显示输出一般是 utf 那肯定乱码了
    浏览器应该是缺少编码的时候做了简单的自动识别,所以用了 gbk 编码
    程序上也可以通过识别字符集进行判断
    tsanie
        4
    tsanie  
       6 天前
    先回复问题,hex 的话可以通过 BOM 来推测编码类型。

    火狐的提示已经很清晰了,非 utf-8 编码资源应该在返回头中声明 Content-Type ,火狐会首先检测这个,然后探测 BOM 。

    > The character encoding of the document was not declared, so the encoding was guessed from content. The character encoding needs to be declared in the Content-Type HTTP header or using a byte order mark.
    unt
        5
    unt  
    OP
       6 天前
    @ldyisbest #2 啊,是 GBK 编码?关键是我试过 GBK 转换你知道吧,转出来还是乱码,所以我才困惑。

    可能是我用的工具不对,坑了我。

    3Q
    512357301
        6
    512357301  
       5 天前 via Android
    @unt #5 国内基操了,不是 u8 就是 gb ,而且你说的转换是怎么转呢,理论上得用十六进制的源码转吧,直接转肯定不行
    unt
        7
    unt  
    OP
       5 天前 via iPhone
    @512357301 拿 hex 转的,用的网上的在线转换工具
    zeromake
        8
    zeromake  
       4 天前
    @unt
    是不是 gzip 压缩了……,有的服务器强制开启 gzip 下发,然后有的 http 客户端不会自动解压 gzip
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5462 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:30 · PVG 16:30 · LAX 00:30 · JFK 03:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.