当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何在GM_xmlhttpRequest中正确处理EUC-JP编码以显示日文?

李昌勋
2024-09-09

一个编码EUC-JP的网站使用GM_xmlhttpRequest请求后,使用encoding.min.js转码后结果不能正常显示

直接请求结果显示乱码,请求结果转码为EUC-JP显示乱码,请求二进制结果,转化为EUC-JP编码,以及再转化为UTF8均显示乱码,如何将结果正常显示日文文字

⚠️#NSFW#

function convertBufferToEucJp(buffer) {
        // Convert buffer to Uint8Array
        const uint8Array = new Uint8Array(buffer);

        // Convert Uint8Array to string with UTF-8 encoding (assuming the buffer is UTF-8)
        const utf8String = new TextDecoder("utf-8").decode(uint8Array);

        // Convert UTF-8 string to EUC-JP
        const eucJpString = Encoding.convert(utf8String, {
            to: 'EUCJP',
            from: 'UTF8'
        });

        return eucJpString;
    }

    GM_xmlhttpRequest({
        method: "GET",
        url: "https://seesaawiki.jp/av_video/d/%c6%e1%b2%ec%ba%ea%a4%e6%a4%ad%a4%cd",
        responseType: "arraybuffer", // Get response as ArrayBuffer
        onload: function(response) {
            if (response.status >= 200 && response.status < 300) {
                // Convert ArrayBuffer to EUC-JP string
                const eucJpString = convertBufferToEucJp(response.response);

                // Do something with the EUC-JP string
                console.log(eucJpString);
            } else {
                console.error("Error fetching data:", response.status);
            }
        },
        onerror: function(error) {
            console.error("Request error:", error);
        },
    });

共有2个答案

杜高谊
2024-09-09

试了一下,把解码函数换成这个就可以了

const ab2str = (arrayBuf, encodeType) =>{
    var decoder = new TextDecoder(encodeType)
    var u8arr = new Uint8Array(arrayBuf)
    return decoder.decode(u8arr)
}

ab2str(response.response, 'EUC-JP')

参考来源:

  • JS如何从ArrayBuffer中解码字符串 | Jack Huang's Blog
漆雕彦
2024-09-09

在你的代码中,问题主要出在假设服务器返回的响应已经是UTF-8编码,但实际上它是EUC-JP编码。当你尝试将EUC-JP编码的二进制数据当作UTF-8来解码时,会导致乱码。因此,你应该直接处理EUC-JP编码的二进制数据,而不是先尝试将其解码为UTF-8字符串。

以下是一个修改后的版本,它直接处理EUC-JP编码的ArrayBuffer,并将其转换为UTF-8字符串(如果你需要的话),以便在控制台或网页上正常显示日文:

// 假设你已经引入了Encoding.js库来处理编码转换

function arrayBufferToEucJpString(buffer) {
    // 这里的buffer已经是EUC-JP编码的二进制数据,不需要额外转换
    // 但由于我们通常需要文本处理,我们可以选择将其转换为UTF-8
    const eucJpString = Encoding.convert(buffer, 'EUCJP', 'UTF8');
    return eucJpString;
}

GM_xmlhttpRequest({
    method: "GET",
    url: "https://seesaawiki.jp/av_video/d/%c6%e1%b2%ec%ba%ea%a4%e6%a4%ad%a4%cd",
    responseType: "arraybuffer", // 直接获取二进制响应
    onload: function(response) {
        if (response.status >= 200 && response.status < 300) {
            // 直接将ArrayBuffer转换为EUC-JP字符串(如果需要UTF-8则如上转换)
            const eucJpString = arrayBufferToEucJpString(response.response);

            // 现在eucJpString是UTF-8编码的字符串,可以直接在控制台或网页上显示
            console.log(eucJpString);
        } else {
            console.error("Error fetching data:", response.status);
        }
    },
    onerror: function(error) {
        console.error("Request error:", error);
    }
});

注意:

  1. 我移除了将ArrayBuffer转换为UTF-8字符串的步骤,直接将其视为EUC-JP编码的二进制数据,并使用Encoding.convert方法将其转换为UTF-8字符串。
  2. 确保你的网页或控制台支持UTF-8编码,以便正确显示日文。
  3. 如果你的目标环境(如某些浏览器扩展)默认不支持EUC-JP编码,确保你使用的库(如Encoding.js)能够正确处理这种编码转换。

另外,如果网页的响应头明确指出了字符编码(Content-Type),则通常不需要手动进行编码转换,除非响应头错误或缺失。在你的情况下,由于你直接通过URL编码访问了资源,且知道其编码为EUC-JP,因此上述方法是适用的。

 类似资料:
  • 在你说这是转发之前,我必须说我已经试过阅读其他帖子,所以请继续阅读。 在text View中显示链接的基本方法可以通过下一种方式完成: 还有绳子。xml文件可能包含: 然而,我们可能希望捕获点击链接的事件,并自行处理。不仅如此,链接可能不需要是真正的url。 许多帖子存在,以显示如何做到这一点,但没有一个,我试图处理好。 有些应用程序允许在应用程序上处理意图,这相当麻烦,可能意味着其他应用程序也可

  • 我正在处理一个PHP项目,它获取电子邮件并在屏幕上显示它们。它在电子邮件中获取以下html: 我的程序是这样做的: 但我的输出是: null 我试过: 1. 但仍显示乱码或中文字符。 正确显示此html的正确方法是什么?

  • 如何将 OpenGl 显示器附加到 J 框架,以便在关闭 JFrame 时破坏显示器?这是我到目前为止的代码: 在我进行可运行之前,我已经将开放显示器连接到JFrame。但是在添加可运行的显示器后,显示屏现在显示的尺寸与我的屏幕尺寸相同。我已尝试重新排列 和 但是没有什么变化,opengl显示仍然是相同的大小,当我尝试先关闭JFrame而不是先关闭显示时,我得到了以下错误: 这让我想到我的 我猜这

  • 问题内容: 这是SQL查询: 当我在Microsoft SQL Server Management Studio中运行此查询时,得到以下信息: 问题:我是否需要在SQL查询中进行任何更改以获取婕㈠瓧的结果,还是代码页等问题? 问题答案: 变量由表示,因此它将是 现在,输出将保持原样。运行以上代码。

  • 我对java servlet文件中的UTF-8有一些问题。当我在URL中获得参数值时,我对UTF-8字符有一些问题。它不能正确显示日语字符。 Jsp标头已具有 我将连接器中的URIEncoding设置添加到服务器中的UTF-8。xml。 我在jsp中编写了如下代码。 然后,我在java servlet中编写了以下代码。 我还使用请求进行了测试。setCharacterEncoding()方法,但它

  • 我有一个缓冲区与字符编码在Windows 1252。然而,当我用适当的编码创建一个新的字符串时,而不是预期的结果,我经常会得到询问标记,例如。 因此,系统应在其上方显示带“^”的“u”字符。而是显示“?”。 任何想法?