我有一个MySQL设置,其中除了来自SqlAlchemy的连接之外,所有的表/字段和字符集设置都是UTF-8
。
我最近将连接字符集更改为UTF-8
,以便随时随地使用UTF-8
。
更改此设置时,数据库中的旧值将呈现错误,例如:
Björn => Björn
这没问题,我只是收集这些值,并使用python中的encode方法对它们进行编码,然后再将它们放回原处。
当我尝试转换在设置更改后插入的、已经正确的值时,就会出现问题。
有没有好的方法来决定我是否应该对这个值进行编码?
发布于 2012-08-14 17:59:28
你以前的编码大概是拉丁语1?
您可能可以通过查看连续的字节来检测一个字符串是用拉丁语-1而不是UTF-8编码的。UTF-8标准有一个distinctive codepage layout,我们可以用它来检测一段文本是用拉丁文-1还是用UTF-8编码的:
如果您所编码的都是拉丁-1字符(直到Unicode代码点255),那么您可以停在这里;任何包含E0-FF范围内的字节的数据都将是旧的拉丁-1数据。
如果您在切换后添加了UTF-8格式的数据,这超出了拉丁-1范围,则还需要包括以下规则:
E0-EF范围内的
3UTF-8字节数据覆盖了BMP的其余部分,您不太可能在此之外进行编码。但是,如果您确实在此之外进行编码,请查找:
F0-F4范围内的
如果所有这些条件都匹配,您可能有一个UTF-8字符串,但您不能100%确定。如果它们中的任何一个不匹配,您肯定有一个拉丁-1字符串。但是,拉丁文-1代码点C2-DF不太可能被代码点80-BF跟随,因为后者中的大多数要么是控制代码,要么是更深奥的变音标记。也许您可以通过寻找多个2字节的UTF-8序列来进一步缩小范围,以增加您的置信度分数。
因此,总而言之(tl;dr):您可以通过查看多字节序列找到大多数拉丁文-1编码的字符串。如果它们不符合严格的UTF-8标准,那么您手头上就有一个拉丁-1字符串。
https://stackoverflow.com/questions/11949005
复制相似问题