我有一个 MySQL 数据库,其中包含一些不良数据。
我从这个 Unicode 字符串开始:
u'TECNOLOGÍA Y EDUCACIÓN'
为数据库编码为 UTF-8 会产生:
'TECNOLOG\xc3\x8dA Y EDUCACI\xc3\x93N'
latin1
当我使用连接字符集和数据库字符集将这些字节发送到数据库时utf8
(是的,我知道这是错误的,但这已经发生了很多次,现在的目标是找出损坏的确切过程,所以它可以反转),数据被转换成这个(使用检查BINARY()
):
'TECNOLOG\xc3\x83\xc2\x8dA Y EDUCACI\xc3\x83\xe2\x80\x9cN'
除了双重编码,我期望的结果是:
'TECNOLOG\xc3\x83\xc2\x8dA Y EDUCACI\xc3\x83\xc2\x93N'
其中大部分是有道理的,因为它将多字节 UTF-8 字符解释为 latin1,并将每个字节编码为单独的字符,但\x93
->的转换\xe2\x80\x9c
没有意义。latin1\x93
不转换为 UTF-8 \xe2\x80\x9c
,但\xe2\x80\x9c
可以转换为 Unicode,产生CP-1252 字符集中的u'\u201c'
代码点。\x93
mysql 在处理转换时是否结合了 latin1 和 CP-1252?如何在 python 中完全复制转换过程?我已经遍历了系统上的每个编码,但它们都不适用于整个字符串。在 python 中,我如何从'TECNOLOG\xc3\x83\xc2\x8dA Y EDUCACI\xc3\x83\xe2\x80\x9cN'
back 回到'TECNOLOG\xc3\x8dA Y EDUCACI\xc3\x93N'
?解码为 UTF-8 将正确处理前 3/4,但最后一个是错误的,我尝试过的任何方法都不会返回正确的结果。