gpt4 book ai didi

php - 任何检测和删除(或修复)错误编码转换导致的错误字符的方法

转载 作者:可可西里 更新时间:2023-10-31 22:59:06 24 4
gpt4 key购买 nike

我正在写一个解析器。我已经处理了所有编码转换以正确输出 UTF-8,但有时源 Material 不正确。例如 â€tm - 编码转换错误的结果。

我知道这是一个远景 - 但有没有人知道由不良字符转换或其他任何东西导致的常见字符串列表,所以我不必构建自己的列表。

是的,我知道我很懒惰,但我读过某处让我成为一名优秀程序员的地方?

最佳答案

tl;dr:请参阅最后两段。


我讨厌/喜欢编码问题。

我们正在查看 Unicode Character 'RIGHT SINGLE QUOTATION MARK' (U+2019) 的变异副本.该字符的字节序列是 0xE2 0x80 0x99。在 Windows-1252 中,它对应于 a+hat、Euro 和商标符号 (™)。我们看到的 'tm' 是该商标符号进一步音译为 ASCII t 和 ASCII m,0x74 0x6D,使我们最终损坏的字节序列 0xE2 0x80 0x74 0x6D

很可能 a+hat-euro-t-m 的实际表示形式已经在 UTF-8 中。也就是说,a+hat 是一个 UTF-8 序列,而欧元符号也是一个 UTF-8 序列,因为有人从一个已经编码不当的 Windows-1252 文档中复制,并粘贴到一个 UTF-8 文档中。您会发现它比原始损坏的四个字节多得多。

解决此问题的一种方法是首先将这些字符的 UTF-8 编码转换回 Windows-1252,然后在写回时将该 Windows-1252 字符串视为 UTF-8。

您可以使用 iconv为此目的使用 //TRANSLIT 标志:

$less_bad = iconv('UTF-8', 'Windows-1252//TRANSLIT', $bad);

这告诉 iconv 尝试将任何不能在 Windows-1252 中表示的字符变成类似的东西。这种翻译是不完美的,会破坏在 Windows-1252 中无法表示的任何合法 UTF-8 字符。

获得 Windows-1252 字符串后,将其保存回来并将其作为 UTF-8 提供。如果一切顺利,腐败应该已经消失,你应该不会有任何问题。

是的,没错。

在这种特定情况下,正确序列的最后一个字节 0x99 已被错误的复制/粘贴修改为两个字节。 您不会通过字符集编码跳转来取回它。

虽然跳圈可能适用于某些文档,但您肯定会发现许多内容的重新编码效果更差。 您最好的选择是执行字节级搜索和替换操作,查找编码不正确的序列并将它们替换为纯 ASCII 或正确的 UTF-8 编码替代品。很多编码错误的方式。例如,如果损坏源在 ISO-8859 系列中,则最终损坏的序列会有所不同,或者最终的 ™ 可能不会被压缩到 tm 在某些地方。

字节级搜索和替换保证只会影响错误的重新编码序列,并且不会留下咀嚼不能用低级字符集表示的单编码 UTF-8 字符的风险。它更安全、更快速。


编辑:我完全没有意识到你已经在计划这样做了。 ;) 不幸的是,我从未见过如此方便的列表。也许您应该发表和宣传您的作品,以便其他人受益。 yourcharacterencodingsucks.com 可用!

关于php - 任何检测和删除(或修复)错误编码转换导致的错误字符的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5188695/

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