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

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

  •  
  •   unt · 7 小时 43 分钟前 · 722 次点击
    https://tianqi.2345.com/t/wea_history/js/202311/55591_202311.js

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

    我通过设置返回结果为 buffer 类型,拿到了 hex,我该怎么尝试来探测它的编码规则呢。
    5 条回复    2024-12-20 11:16:04 +08:00
    iikebug
        1
    iikebug  
       7 小时 38 分钟前
    默认以 utf8 解码了,你指定一下响应编码类型就好了
    ldyisbest
        2
    ldyisbest  
       7 小时 15 分钟前   ❤️ 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  
       7 小时 5 分钟前
    这个文件缺少编码指定,你开发默认显示输出一般是 utf 那肯定乱码了
    浏览器应该是缺少编码的时候做了简单的自动识别,所以用了 gbk 编码
    程序上也可以通过识别字符集进行判断
    tsanie
        4
    tsanie  
       7 小时 4 分钟前
    先回复问题,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 小时 52 分钟前
    @ldyisbest #2 啊,是 GBK 编码?关键是我试过 GBK 转换你知道吧,转出来还是乱码,所以我才困惑。

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

    3Q
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4266 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 10:08 · PVG 18:08 · LAX 02:08 · JFK 05:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.