js 如何转换公司老旧网页返回的 gb2312 的 jsp?

2023-09-10 22:47:52 +08:00
 pdog18
我尝试使用 js 的 TextEncoder 与 TextDecoder 发现 encoder + decoder 无法返回我希望的 utf-8 的结果

我很好奇为什么没有效果,这个返回的 respond 的 text() 就是一个 gb2312 的 html ,如果是浏览器直接渲染,那么是可以正常显示的(因为浏览器可以支持 gb2312 )

但是我使用 Encoder 却无法转换为 utf-8 ,是我一直一来对编码的认知出现了问题?
974 次点击
所在节点    问与答
7 条回复
pdog18
2023-09-10 22:53:46 +08:00
我好像想的太简单了,这个转换编码的操作似乎无法仅通过浏览器内部的 js 环境完成。
我看了下 iconv 似乎是需要 node 支持的?
yinmin
2023-09-10 23:56:21 +08:00
试试 GPT4 ,他会给你解决方案
yinmin
2023-09-11 00:02:09 +08:00
GPT4 给出方案的核心代码如下:

fetch('your-url')
.then(response => response.arrayBuffer())
.then(data => {
const decoder = new TextDecoder('gbk');
const decodedText = decoder.decode(new Uint8Array(data));
console.log(decodedText);
});

大致意思是需要获取二机制数据,而不是字符串,然后进行 GBK 的 decoder (GBK 与 GB2312 兼容的)。

V2EX 不建议用户直接黏贴 GPT 的答复,具体说明可以自己问一下 GPT4 。
ysc3839
2023-09-11 00:04:40 +08:00
response 不要用 text(),用 arrayBuffer()试试?
timethinker
2023-09-11 00:27:53 +08:00
```javascript

const utf8String = "\xC4\xE3\xBA\xC3";
console.log(utf8String); // 输出: ÄãºÃ
const decoder = new TextDecoder('gb2312');
const result = decoder.decode(Buffer.from(utf8String, 'binary'));
console.log(result); // 输出: 你好

```
timethinker
2023-09-11 00:42:20 +08:00
为什么会看到乱码呢,浏览器 JS 环境一般使用的就是 UTF-8 编码,那么如果二进制数据不是这个编码,然后又使用 UTF-8 的字符串变量来进行展示,显示出来就会是乱码。换句话来说,首先拿到手的就是一堆二进制数据,但是这个二进制数据拿来当作什么用途,就需要对其进行解码,如果编码和解码匹配不上,就会出现问题。

所以如果你拿到手的已经是一个通过 UTF-8 解码表示二进制数据的字符串了(也就是你说的 response.text() ),首先应该把它转回二进制,然后再使用正确的解码器来对其进行解码操作。但是当然更好的办法是可以直接拿到 response.arrayBuffer()
pdog18
2023-09-11 09:46:25 +08:00
太感谢各位了

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

https://www.v2ex.com/t/972557

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

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

© 2021 V2EX