gpt4 book ai didi

language-agnostic - 检测字符串是否以 UTF-8 进行双重编码

转载 作者:行者123 更新时间:2023-12-04 08:37:08 27 4
gpt4 key购买 nike

我需要处理一大串短字符串(主要是俄语,但任何其他语言都是可能的,包括猫在键盘上行走的随机垃圾)。

其中一些字符串将在 UTF-8 中编码两次。

我需要可靠地检测给定的字符串是否被双重编码,并修复它。我应该在不使用任何外部库的情况下执行此操作,只需检查字节即可。检测应尽可能快。

问题是:如何检测给定的字符串以 UTF-8 编码两次?

更新:

原始字符串采用 UTF-8 格式。这是执行第二次编码的 AS3 代码(不幸的是我无法控制客户端代码,所以我无法解决这个问题):

private function toUTF8(s : String) : String {
var byteArray : ByteArray = new ByteArray();
byteArray.writeUTFBytes(s);
byteArray.position = 0;

var res : String = "";

while(byteArray.bytesAvailable){
res += String.fromCharCode(byteArray.readUnsignedByte());
}

return res;
}

myString = toUTF8(("" + myString).toLowerCase().substr(0, 64));

备注 toLowerCase()称呼。也许这可能有帮助?

最佳答案

原则上你不能,特别是允许猫垃圾。

您没有说明数据在进行一次或两次 UTF-8 编码之前的原始字符编码是什么。我将假设 CP1251,(或者至少 CP1251 是其中一种可能性),因为这是一个非常棘手的案例。

取一个非 ASCII 字符。 UTF-8 编码它。你得到一些字节,所有这些字节都是 CP1251 中的有效字符,除非其中一个恰好是 0x98,这是 CP1251 中唯一的漏洞。

因此,如果您将这些字节从 CP1251 转换为 UTF-8,结果与您正确使用 UTF-8 编码由这些俄语字符组成的 CP1251 字符串完全相同。无法判断结果是错误地对一个字符进行了双重编码,还是对 2 个字符进行了正确的单一编码。

如果您对原始数据有一定的控制权,则可以在其开头放置一个 BOM。然后,当它返回给您时,检查初始字节以查看您是否有 UTF-8 BOM,或者是否对 BOM 进行了错误的双重编码。但我想你可能对原文没有那种控制权。

在实践中你可以猜到 - UTF-8 解码它然后:

(a) 查看字符频率、字符对频率、不可打印字符的数量。这可能允许您暂时将其声明为无意义,因此可能会进行双重编码。如果有足够多的不可打印字符,它可能会非常荒谬,以至于您甚至无法通过敲击键盘来实际输入它,除非您的 ALT 键被卡住了。

(b) 尝试第二次解码。也就是说,从您通过解码 UTF-8 数据获得的 Unicode 代码点开始,首先将其编码为 CP1251(或其他),然后从 UTF-8 解码结果。如果任一步骤失败(由于字节序列无效),那么它肯定不是双重编码的,至少没有使用 CP1251 作为错误解释。

如果您有一些可能是 UTF-8 或 CP1251 的字节,而您不知道是哪个,这或多或少就是您所做的。

对于与双重编码数据无法区分的单编码猫垃圾,您会得到一些误报,对于双重编码的数据,可能会有极少的误报,但在第一次被 Fluke 编码后仍然看起来像俄语。

如果你的原始编码比 CP1251 有更多的漏洞,那么你的假阴性就会更少。

字符编码很难。

关于language-agnostic - 检测字符串是否以 UTF-8 进行双重编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032448/

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