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

44 天前
 unt
https://tianqi.2345.com/t/wea_history/js/202311/55591_202311.js

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

我通过设置返回结果为 buffer 类型,拿到了 hex,我该怎么尝试来探测它的编码规则呢。
1575 次点击
所在节点    程序员
8 条回复
iikebug
44 天前
默认以 utf8 解码了,你指定一下响应编码类型就好了
ldyisbest
44 天前
这段代码正常

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
44 天前
这个文件缺少编码指定,你开发默认显示输出一般是 utf 那肯定乱码了
浏览器应该是缺少编码的时候做了简单的自动识别,所以用了 gbk 编码
程序上也可以通过识别字符集进行判断
tsanie
44 天前
先回复问题,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
44 天前
@ldyisbest #2 啊,是 GBK 编码?关键是我试过 GBK 转换你知道吧,转出来还是乱码,所以我才困惑。

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

3Q
512357301
43 天前
@unt #5 国内基操了,不是 u8 就是 gb ,而且你说的转换是怎么转呢,理论上得用十六进制的源码转吧,直接转肯定不行
unt
43 天前
@512357301 拿 hex 转的,用的网上的在线转换工具
zeromake
42 天前
@unt
是不是 gzip 压缩了……,有的服务器强制开启 gzip 下发,然后有的 http 客户端不会自动解压 gzip

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1098984

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX