我可以用 javascript 恢复错误的编码吗

问题描述 投票:0回答:2

我需要用 javascript 修复一些网络数据的编码。我无法控制数据的生成方式,但这基本上就是正在发生的事情:

(new TextDecoder('latin1')).decode((new TextEncoder()).encode('å'))
'Ã¥'

所以目前页面显示的是 ñ¥ 而不是预期的 å

我怎样才能用一些javascript代码或页眉来解决这个问题??

这是对正在发生的事情的一些解释:https://stackoverflow.com/a/34434386/42580

javascript encoding
2个回答
0
投票

如果您的数据编码错误并且您正在使用 JavaScript,则可以尝试使用各种方法清理或转换编码。但是,请记住,恢复错误的编码可能具有挑战性,成功与否取决于编码问题的性质和程度。

您可以采取以下一些步骤:

1. 检测编码:

  • 尝试使用 chardetjschardet 等库检测文本的编码。
  • 这些库分析文本中的字节模式,以对编码进行有根据的猜测。

2. 转换为 Unicode:

  • 一旦您了解了编码,您就可以尝试使用现代浏览器中的
    TextDecoder
    等功能将文本转换为 Unicode。
// Assuming 'encodedText' is your text with bad encoding
const decoder = new TextDecoder('UTF-8'); // Change 'UTF-8' to the detected encoding
const uint8Array = new TextEncoder().encode(encodedText);
const decodedText = decoder.decode(uint8Array);

3. 清除无效字符:

  • 删除或替换可能因编码错误而导致的无效字符。您可以使用正则表达式来匹配和替换这些字符。
// Example: Replace all non-printable ASCII characters
const cleanedText = encodedText.replace(/[^\x20-\x7E]/g, '');

4. 手动修正:

  • 如果自动方法失败,您可能需要手动检查文本,识别编码问题,并根据数据上下文进行更正。

组合步骤示例:

const detectEncoding = require('chardet'); // Assuming you've installed chardet using npm

function fixBadEncoding(encodedText) {
    // Step 1: Detect encoding
    const detectedEncoding = detectEncoding.detect(Buffer.from(encodedText));

    // Step 2: Convert to Unicode
    const decoder = new TextDecoder(detectedEncoding.encoding);
    const uint8Array = new TextEncoder().encode(encodedText);
    const decodedText = decoder.decode(uint8Array);

    // Step 3: Clean invalid characters
    const cleanedText = decodedText.replace(/[^\x20-\x7E]/g, '');

    return cleanedText;
}

const badEncodedText = '...'; // Replace with your actual text
const fixedText = fixBadEncoding(badEncodedText);
console.log(fixedText);

请记住,这些都是通用策略,修复错误编码的成功率可能会根据数据的具体情况而有所不同。在尝试任何编码转换之前备份数据也是一个好习惯,尤其是在数据至关重要的情况下。


0
投票

要解决编码问题,我认为您可以使用 TextDecoder for Latin1 解码错误编码的字符串,然后使用 UTF-8 中的 TextEncoder 重新编码。

const fixEncoding = str => {
    let decodedStr = new TextDecoder('latin1').decode(new TextEncoder().encode(str));
    return new TextDecoder('utf-8').decode(new TextEncoder().encode(decodedStr));
}

console.log(fixEncoding('Ã¥'));
© www.soinside.com 2019 - 2024. All rights reserved.