我有一个巨大的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
Run Code Online (Sandbox Code Playgroud)
这是有趣的输出......:
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
Run Code Online (Sandbox Code Playgroud)
开头的奇怪字符串Ã
显示为enc2,即两个utf-8编码,其中散布的latin-1解码投入到混合中.正如您所看到的那样,它可以通过完全相反的操作序列来解除:解码为utf-8,重新编码为latin-1,再次重新解码为utf-8 - 原始字符串又回来了(yay !).
我相信Latin-1(又名ISO-8859-1)和UTF-8的正常往返特性应该保证这个序列能够正常工作(抱歉,没有C#可以立即尝试使用该语言,但我会期望编码/解码序列不应该依赖于使用的特定编程语言.