gpt4 book ai didi

c# - 如何将经过 UTF-8 编码两次的字符串解码为简单的 UTF-8?

转载 作者:可可西里 更新时间:2023-11-01 06:44:23 24 4
gpt4 key购买 nike

我有一个巨大的 MySQL 表,其中的行以 UTF-8 编码了两次。例如,“Újratárgyalja”存储为“Újratárgyalja”。

MySQL .Net 连接器以这种方式下载它们。我尝试了很多与 System.Text.Encoding.Convert() 的组合,但没有一个有效。

发送 set names 'utf8'(或其他字符集)不会解决问题。

如何将它们从双 UTF-8 解码为 UTF-8?

最佳答案

特殊问题,但我认为我可以通过 UTF-8 和 Latin-1 的适当邪恶混合来重现它(尽管不是仅仅通过两次使用 UTF-8 而没有穿插 Latin-1 中的错误步骤)。这是整个奇怪的往返旅程,“来来回回”(Python 2.* 或 IronPython 都应该能够重现这一点):

# -*- coding: utf-8 -*-
uni = u'Újratárgyalja'
enc1 = uni.encode('utf-8')
enc2 = enc1.decode('latin-1').encode('utf-8')
dec3 = enc2.decode('utf-8')
dec4 = dec3.encode('latin-1').decode('utf-8')

for x in (uni, enc1, enc2, dec3, dec4):
print repr(x), x

这是有趣的输出...:

u'\xdajrat\xe1rgyalja' Újratárgyalja
'\xc3\x9ajrat\xc3\xa1rgyalja' Újratárgyalja
'\xc3\x83\xc2\x9ajrat\xc3\x83\xc2\xa1rgyalja' Ãjratárgyalja
u'\xc3\x9ajrat\xc3\xa1rgyalja' Ãjratárgyalja
u'\xdajrat\xe1rgyalja' Újratárgyalja

à 开头的奇怪字符串显示为 enc2,即两个 utf-8 编码和一个散布的 latin-1 解码被扔到混合中。正如您所看到的,它可以通过完全相反的操作序列来撤销:解码为 utf-8,重新编码为 latin-1,再次重新解码为 utf-8——原始字符串又回来了(耶!)。

我相信 Latin-1(又名 ISO-8859-1)和 UTF-8 的正常往返属性应该保证这个序列可以工作(抱歉,现在没有 C# 可以尝试使用该语言,但我希望编码/解码序列不应该依赖于所使用的特定编程语言。

关于c# - 如何将经过 UTF-8 编码两次的字符串解码为简单的 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1449114/

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