Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将经过两次UTF-8编码的字符串解码为简单UTF-8?_C#_Mysql_Utf 8 - Fatal编程技术网

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

C# 如何将经过两次UTF-8编码的字符串解码为简单UTF-8?,c#,mysql,utf-8,C#,Mysql,Utf 8,我有一个巨大的MySQL表,它的行用UTF-8编码了两次。 例如,“Újratárgyalja”存储为“ÚjratÃrgyalja” MySQL.Net连接器以这种方式下载它们。我尝试了很多与System.Text.Encoding.Convert()的组合,但都不起作用 发送集合名称“utf8”(或其他字符集)无法解决此问题 如何将它们从双UTF-8解码为UTF-8?您可以尝试使用 SELECT CONVERT(`your_column` USING ascii) FROM `your_ta

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

MySQL.Net连接器以这种方式下载它们。我尝试了很多与
System.Text.Encoding.Convert()的组合,但都不起作用

发送
集合名称“utf8”
(或其他字符集)无法解决此问题

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

您可以尝试使用

SELECT CONVERT(`your_column` USING ascii)
FROM `your_table`

在MySQL查询级别。这是一个暗箭伤人的问题。

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

这是有趣的输出…:

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编码,混合中插入了一个拉丁-1解码。正如你所看到的,它可以通过完全相反的操作序列来撤销:解码为utf-8,重新编码为拉丁语-1,再次解码为utf-8——原来的字符串回来了(耶!)

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

<“MySQL.Net连接器以这种方式下载它们。”这很有可能意味着MySQL.Net连接器认为它在对MySQL说拉丁语-1,而MySQL认为对话是用UTF-8进行的。也有可能该列声明为拉丁语-1,但实际上包含UTF-8数据

如果是后者(列标记为Latin-1,但数据实际上是UTF-8),如果您使用MySQL的文本处理功能、列上的ORDER BY或其他文本“有意义”而不仅仅是通过线路发送的字节的情况,您将遇到神秘的排序问题和其他错误


在任何一种情况下,您都应该尝试修复潜在的问题,尤其是因为这对于任何必须维护系统的人来说都将是一个彻底的头痛问题。

巧妙。答案是可以接受的。不过,出于我自己的好奇,我尝试在Windows上用Python 2.6.1复制您的结果。这很艰难,因为复制和粘贴代码的ct会产生问题(例如,粘贴到记事本和空闲编辑器中是完全不同的!)。然后执行它会产生更多问题(如果在空闲之外,则必须只打印repr(x)。[我知道,我知道,得到一个真正的操作系统,等等]我不得不对这个问题投赞成票,主要是因为它促使Alex给出了非常他妈的漂亮的答案。此外,编码通常是一项棘手的工作,因为我发现,只是在我自己的机器上试验Alex的答案。我觉得他的方法可能会有所帮助(至少作为一个线索)在其他互操作性上下文中也是如此。该列被声明为UTF-8,其中存储的数据也是UTF-8,但出于某些神秘的原因,PHP的PDO扩展对其进行了两次编码。您以前从未提到过PHP。那么MySQL数据库中的数据是否真的损坏了?我在第一句话中就提到过,它存储在MySQL数据库就是这样的。但是,我没有提到PHP的PDO扩展是这样存储的,因为最初的问题是如何在C#中解码一个已经被UTF-8编码两次的字符串。好吧,在这种情况下,你肯定应该在数据库中修复它,因为我在第二段中给出了所有的原因。它很容易出错配置PHP+MySQL并执行此操作,我自己已经完成了,但幸运的是我很快就完成了。您可以在MySQL内部执行相同的解码/编码运行,但您需要小心(首先创建备份)。
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