This topic created in 976 days ago, the information mentioned may be changed or developed.
我尝试使用 js 的 TextEncoder 与 TextDecoder 发现 encoder + decoder 无法返回我希望的 utf-8 的结果
我很好奇为什么没有效果,这个返回的 respond 的 text() 就是一个 gb2312 的 html ,如果是浏览器直接渲染,那么是可以正常显示的(因为浏览器可以支持 gb2312 )
但是我使用 Encoder 却无法转换为 utf-8 ,是我一直一来对编码的认知出现了问题?
7 replies • 2023-09-11 09:46:25 +08:00
 |
|
1
pdog18 Sep 10, 2023
我好像想的太简单了,这个转换编码的操作似乎无法仅通过浏览器内部的 js 环境完成。 我看了下 iconv 似乎是需要 node 支持的?
|
 |
|
2
yinmin Sep 10, 2023 1
试试 GPT4 ,他会给你解决方案
|
 |
|
3
yinmin Sep 11, 2023 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 Sep 11, 2023 via Android 1
response 不要用 text(),用 arrayBuffer()试试?
|
 |
|
5
timethinker Sep 11, 2023 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 Sep 11, 2023 1
为什么会看到乱码呢,浏览器 JS 环境一般使用的就是 UTF-8 编码,那么如果二进制数据不是这个编码,然后又使用 UTF-8 的字符串变量来进行展示,显示出来就会是乱码。换句话来说,首先拿到手的就是一堆二进制数据,但是这个二进制数据拿来当作什么用途,就需要对其进行解码,如果编码和解码匹配不上,就会出现问题。
所以如果你拿到手的已经是一个通过 UTF-8 解码表示二进制数据的字符串了(也就是你说的 response.text() ),首先应该把它转回二进制,然后再使用正确的解码器来对其进行解码操作。但是当然更好的办法是可以直接拿到 response.arrayBuffer()
|