gpt4 book ai didi

perl - 修复由 UTF-8 和 Windows-1252 组成的文件

转载 作者:行者123 更新时间:2023-12-04 01:56:32 41 4
gpt4 key购买 nike

我有一个生成 UTF-8 文件的应用程序,但其中一些内容的编码不正确。一些字符被编码为 iso-8859-1 aka iso-latin-1 或 cp1252 aka Windows-1252。有没有办法恢复原文?

最佳答案

是的!

显然,修复创建文件的程序会更好,但这并不总是可行的。下面是两种解决方案。

一行可以包含多种编码

Encoding::FixLatin提供了一个名为 fix_latin 的函数它解码由 UTF-8、iso-8859-1、cp1252 和 US-ASCII 混合组成的文本。

$ perl -e'
use Encoding::FixLatin qw( fix_latin );
$bytes = "\xD0 \x92 \xD0\x92\n";
$text = fix_latin($bytes);
printf("U+%v04X\n", $text);
'
U+00D0.0020.2019.0020.0412.000A

使用启发式方法,但它们相当可靠。只有以下情况会失败:
  • 使用iso-8859-1或cp1252编码的[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß]之一,然后是[€‚ƒ„…†‡ˆŸŠ‰‹Œ–ž7š'1"1 ¡£¤¥|§¨©ª«¬ <NBSP> ®¯°±²³´µ¶·¸¹º»¼½¾¿] 使用 iso-8859-1 或 cp1252 编码。
  • 使用 iso-8859-1 或 cp1252 编码的 [àáâãäåæçèéêëìíîï] 之一,然后是两个 [€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ <SHY> ¡£¤¥|§¨©ª«¬ <NBSP> ®¯°±²³´µ¶·¸¹º»¼½¾¿] 使用 iso-8859-1 或 cp1252 编码。
  • [ðñòóôõö÷] 之一使用 iso-8859-1 或 cp1252 编码,然后是两个 [€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ <SHY> ¡£¤¥|§¨©ª«¬ <NBSP> ®¯°±²³´µ¶·¸¹º»¼½¾¿] 使用 iso-8859-1 或 cp1252 编码。

  • 使用核心模块 Encode 可以产生相同的结果,虽然我认为这比安装了 Encoding::FixLatin::XS 的 Encoding::FixLatin 慢一点。
    $ perl -e'
    use Encode qw( decode_utf8 encode_utf8 decode );
    $bytes = "\xD0 \x92 \xD0\x92\n";
    $text = decode_utf8($bytes, sub { encode_utf8(decode("cp1252", chr($_[0]))) });
    printf("U+%v04X\n", $text);
    '
    U+00D0.0020.2019.0020.0412.000A

    每行只使用一种编码
    <SHY>在角色级别上工作。如果知道每一行完全使用 UTF-8、iso-8859-1、cp1252 或 US-ASCII 之一进行编码,您可以通过检查该行是否为有效的 UTF-8 来使该过程更加可靠。
    $ perl -e'
    use Encode qw( decode );
    for $bytes ("\xD0 \x92 \xD0\x92\n", "\xD0\x92\n") {
    if (!eval {
    $text = decode("UTF-8", $bytes, Encode::FB_CROAK|Encode::LEAVE_SRC);
    1 # No exception
    }) {
    $text = decode("cp1252", $bytes);
    }

    printf("U+%v04X\n", $text);
    }
    '
    U+00D0.0020.2019.0020.00D0.2019.000A
    U+0412.000A

    使用启发式方法,但它们非常可靠。只有在 时它们才会失败全部 对于给定的行,以下情况是正确的:
  • 该行使用 iso-8859-1 或 cp1252 编码,
  • [€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–-˜™š›œžŸ fix_latin 中的至少一项¡£¤¥|§¨©ª«¬ <NBSP> ®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòõö5÷4|7|1|1|7
  • [ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß]的所有实例总是紧跟在[€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—™š›œž67~9104|5 ¡£¤¥|§¨©ª«¬ <SHY> ®¯°±²³´µ¶·¸¹º»¼½¾¿],
  • [àáâãäåæçèéêëìíîï]的所有实例后面总是正好有两个[€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ <NBSP> ¡£¤¥|§¨©ª«¬ <SHY> ®¯°±²³´µ¶·¸¹º»¼½¾¿],
  • [ðñòóôõö÷] 的所有实例总是紧跟在三个 [€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“"•–-˜™š›œžŸ <NBSP> ¡£¤¥|§¨©ª«¬ <SHY> ®¯°±²³´µ¶·¸¹º»¼½¾¿],
  • [øùúûüýþÿ] 不存在于该行中,并且
  • [€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ <NBSP> ¡£¤¥|§¨©ª«¬ <SHY> ®¯°±²³´µ¶·¸¹º»¼½¾¿] 存在于该行中,除非前面提到过。


  • 注意事项:
  • Encoding::FixLatin 安装命令行工具<NBSP>转换文件,使用第二种方法编写一个文件将是微不足道的。
  • <SHY> (功能和文件)可以通过安装 Encoding::FixLatin::XS 来加速.
  • 相同的方法可用于 UTF-8 与其他单字节编码的混合。可靠性应该是相似的,但可能会有所不同。
  • 关于perl - 修复由 UTF-8 和 Windows-1252 组成的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28681864/

    41 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com