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

标签 c# mysql utf-8

我有一个巨大的 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/

相关文章:

postgresql - 从 PostgreSQL 导出的编码问题

c# - 并行编程——我需要一些说明

c# - Groupby,在 Linq lambda 中与多个连接求和

c# - 返回 View 内的部分 View

c# - Windows Phone 应用程序中文本框的类似笔记本的背景

php - 数据库查询执行时间太长

php - laravel 5.2 mysql 批量插入使用多个 AJAX 请求,toSql() 错误

mysql - 如何在mysql表中添加带有计数值的列?

encoding - url在asp3中编码

php - UTF-8 给了我问号