4

我最近偶然发现了一个使用 Latin1 编码的 MySQL 数据库,并且在浏览器问号符号上查看时正在呈现。为了解决这个问题,我们将所有表上的 DB 编码更改为 utf8,将排序规则更改为 utf8_general_ci,但是已经存储的数据仍然显示有问号,所有从 mysql 到浏览器的数据存储和轮询由 php 完成,我确保在 php 上也使用了 utf8,甚至按照网上很多人的建议运行了 set names utf8,问题是现在我在我们知道没有的字符串上得到了奇怪的字符,例如 ÃÂ' .

数据示例

存储:

EMMANUEL PE\xc3\u0192\xc2\u2018A GOMEZ 葡萄牙

渲染:

EMMANUEL PEÃÂ'A GOMEZ 葡萄牙

恰当的:

伊曼纽尔·皮亚·戈麦斯 葡萄牙


存储:

Luis Hern\xe1ndez-Higareda

渲染:

路易斯·埃尔南德斯-希加雷达

恰当的:

路易斯·埃尔南德斯-希加雷达


存储:

Teresa de Jes\xc3\u0192\xc2\xbas 加利西亚 G\xc3\u0192\xc2\xb3mez

渲染:

Teresa de Jesús 加利西亚 Gómez

恰当的:

特蕾莎·德·赫苏斯·加利西亚·戈麦斯


存储:

博士。JOS\xc3\u0192\xc2\u2030 ABEN\xc3\u0192\xc2\x81MAR RIC\xc3\u0192\xc2\x81RDEZ GARC\xc3\u0192\xc2\x8dA

恰当的:

博士。JOSÉ ABENÃÂMAR RICÃÂRDEZ GARCÃÂA

目前我正在使用 python 从数据库中获取数据,我正在尝试标准化为 unicode utf8 但我真的迷路了,就我到这里而言,我需要转换当前显示的内容很奇怪字符转换为可读文本,如上所示。

我在这里想念什么?数据是不可修复的吗?

功能 https://gist.github.com/2649463

注意: 在所有示例中,有 1 个是正确渲染的(如果有任何关于如何解决此问题的建议,请考虑是否存在)

4

2 回答 2

4

尝试这个:

print str.encode('cp1252').decode('utf-8').encode('cp1252').decode('utf-8')

使用示例ipython

In [49]: a=u'Teresa de Jes\xc3\u0192\xc2\xbas Galicia G\xc3\u0192\xc2\xb3mez'

In [50]: a=u'Teresa de Jes\xc3\u0192\xc2\xbas Galicia G\xc3\u0192\xc2\xb3mez'

In [51]: print a
Teresa de Jesús Galicia Gómez

In [52]: print a.encode('cp1252').decode('utf-8').encode('cp1252').decode('utf-8')
Teresa de Jesús Galicia Gómez

这是一个“错误编码”的 utf-8..

于 2012-05-09T23:10:24.020 回答
3

如果您尝试将无法表示的字符插入latin1存储在该字符编码下的列中,这些字符将被不可逆转地替换为?- 信息已丢失:您唯一的选择是重新插入/更新数据,因为该列已存储在utf8.

但是,您问题中的某些数据没有多大意义。例如:

存储:

EMMANUEL PE\xc3\u0192\xc2\u2018A GOMEZ 葡萄牙

您是否尝试显示当前存储的字节字符?无论哪种方式,其中一个\u\x转义码都是没有意义的。

你说原始数据被编码为latin1; 在该字符集中,Ñ字符被编码为0xd1. 您说您随后将数据转换为utf8,这会将该字符的编码更改为双字节序列0xc391(这解释了\xc3您在上面显示为被存储;但是,尚不清楚第二个字节如何0x91变成片段\u0192\xc2\u2018中的序列*)。

我怀疑数据实际上已经通过一些进一步的转换,可能是在当前存储的数据和您用于查看此类存储的任何方式之间。建议您首先确切地确定数据库中存储的内容:

SELECT HEX(my_column) FROM my_table WHERE ...

一旦确定了这一点,您将能够更好地了解需要对存储的数据进行哪些转换(如果有)来进行,utf8以及在存储和检索操作期间发生了哪些不希望的转换(如果有)。


* 现在阅读了 Thanasis Petsas 的答案,我意识到他已经发现您似乎已经将正确编码的utf8字符串解码为latin1,使用 对生成的字符进行编码utf8,然后latin1再次解码这些字节。这确实会产生您所显示的字符序列,但仍然有必要了解实际存储的内容以及检索期间的转换。

于 2012-05-10T00:21:35.877 回答