gpt4 book ai didi

utf-8 - 如何检测并修复不正确的字符编码

转载 作者:行者123 更新时间:2023-12-02 03:13:51 26 4
gpt4 key购买 nike

上游服务读取 UTF-8 字节流,假设它们是 ISO-8859-1,将 ISO-8859-1 应用于 UTF-8 编码,并将它们发送到我的服务,标记为 UTF-8。

上游服务不在我的控制范围内。他们可能会修复它,但可能永远不会修复。

我知道我可以通过将 UTF-8 应用于 ISO-8859-1 编码然后将字节标记为 UTF-8 来修复编码。但是如果我的上游解决了他们的问题会发生什么?

有没有办法检测此问题并仅在发现错误编码时修复编码?

我也不确定上游编码是否为 ISO-8859-1。我认为上游是 perl,因此编码有意义,并且当我应用 ISO-8859-1 编码时,我尝试正确解码的每个样本。


当源发送 e4 9c 94 (✔) 到我的上游时,我的上游向我发送 c3 a2 c2 9c c2 94 (â)。

  • utf-8 字符串 作为字节:e4 9c 94
  • 字节 e4 9c 94 作为 latin1 字符串:â
  • utf-8 字符串 â 作为字节:c3 a2 c2 9c c2 94

我可以使用 upstream.encode('ISO-8859-1').force_encoding('UTF-8') 修复它,但一旦上游问题得到解决,它就会中断。

最佳答案

既然你知道它是如何被破坏的,你可以尝试通过解码接收到的 UTF-8 字节,编码为 latin1,然后再次解码为 UTF-8 来解密它。只有损坏的字符串、纯 ASCII 字符串或极不可能的 latin-1 字符串组合才能成功解码两次。如果解码失败,则假设上游已修复,只需将其解码为 UTF-8 一次。纯 ASCII 字符串可以使用任一方法正确解码,因此也不存在问题。有一些有效的 UTF-8 编码序列可以在双重解码后幸存下来,但它们不太可能出现在普通文本中。

这是一个 Python 示例(您没有提到语言...):

    # Assume bytes are latin1, but return encoded UTF-8.
def bad(b):
return b.decode('latin1').encode('utf8')

# Assume bytes are UTF-8, and pass them along.
def good(b):
return b

def decoder(b):
try:
return b.decode('utf8').encode('latin1').decode('utf8')
except UnicodeError:
return b.decode('utf8')

b = '✔'.encode('utf8')
print(decoder(bad(b)))
print(decoder(good(b)))

输出:



关于utf-8 - 如何检测并修复不正确的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56761626/

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