字符串编码和解码可能来自拉丁1和utf8

2024-10-01 13:39:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

数据示例

存储:

EMMANUEL PE\xc3\u0192\xc2\u2018A戈麦斯葡萄牙

呈现:

葡萄牙戈麦斯

适当的:

葡萄牙戈麦斯


存储:

路易斯·赫恩\xe1ndez Higareda

呈现:

路易斯·赫尔南德斯·希加雷达

适当的:

路易斯·赫尔南德斯·希加雷达


存储:

Teresa de Jes\xc3\u0192\xc2\xbas Galicia G\xc3\u0192\xc2\xb3mez

呈现:

特蕾莎·德杰斯

适当的:

特蕾莎·德杰斯·加利西亚·戈梅斯


存储:

乔斯博士\xc3\u0192\xc2\u2030 ABEN\xc3\u0192\xc2\x81MAR RIC\xc3\u0192\xc2\x81RDEZ GARC\xc3\u0192\xc2\x8dA

适当的:

亚伯斯特朗博士

目前我正在使用python从数据库中获取数据,我试图将其规范化为unicode utf8,但我真的迷路了,我需要将当前显示为奇怪字符的内容转换为可读文本,如上图所示。在

我错过了什么?数据是不可修复的吗?在

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

注意: 在所有的例子中,有1个是正确呈现的(如果有任何关于如何解决这个问题的建议,请考虑一下)


Tags: 数据字符串数据库编码mysql符号浏览器utf8
2条回答

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

然而,你问题中的一些数据没有什么意义。例如:

Stored:

EMMANUEL PE\xc3\u0192\xc2\u2018A GOMEZ PORTUGAL

您是要显示当前存储的字节还是字符?不管怎样,\u或{}转义码之一是没有意义的。在

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

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

SELECT HEX(my_column) FROM my_table WHERE ...

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


*在阅读了塔纳斯·佩特萨的答案后,我意识到他发现你似乎正确地解码了utf8-编码为latin1的字符串,使用utf8对结果字符进行编码,然后再次将这些字节解码为latin1。这确实会产生您所显示的字符序列,但仍然有必要了解实际存储的内容以及检索过程中转换的原因。

试试这个:

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

使用ipython的示例:

^{pr2}$

这是一个utf-8,编码错误。。在

相关问题 更多 >