1
pdog18 OP 我好像想的太简单了,这个转换编码的操作似乎无法仅通过浏览器内部的 js 环境完成。
我看了下 iconv 似乎是需要 node 支持的? |
2
yinmin 2023-09-10 23:56:21 +08:00 1
试试 GPT4 ,他会给你解决方案
|
3
yinmin 2023-09-11 00:02:09 +08:00 1
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 。 |
4
ysc3839 2023-09-11 00:04:40 +08:00 via Android 1
response 不要用 text(),用 arrayBuffer()试试?
|
5
timethinker 2023-09-11 00:27:53 +08:00 1
```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); // 输出: 你好 ``` |
6
timethinker 2023-09-11 00:42:20 +08:00 1
为什么会看到乱码呢,浏览器 JS 环境一般使用的就是 UTF-8 编码,那么如果二进制数据不是这个编码,然后又使用 UTF-8 的字符串变量来进行展示,显示出来就会是乱码。换句话来说,首先拿到手的就是一堆二进制数据,但是这个二进制数据拿来当作什么用途,就需要对其进行解码,如果编码和解码匹配不上,就会出现问题。
所以如果你拿到手的已经是一个通过 UTF-8 解码表示二进制数据的字符串了(也就是你说的 response.text() ),首先应该把它转回二进制,然后再使用正确的解码器来对其进行解码操作。但是当然更好的办法是可以直接拿到 response.arrayBuffer() |
7
pdog18 OP 太感谢各位了
|