首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在更改连接字符集时确定是否应该编码?

如何在更改连接字符集时确定是否应该编码?
EN

Stack Overflow用户
提问于 2012-08-14 17:02:20
回答 1查看 215关注 0票数 0

我有一个MySQL设置,其中除了来自SqlAlchemy的连接之外,所有的表/字段和字符集设置都是UTF-8

我最近将连接字符集更改为UTF-8,以便随时随地使用UTF-8

更改此设置时,数据库中的旧值将呈现错误,例如:

代码语言:javascript
运行
复制
Björn => Björn

这没问题,我只是收集这些值,并使用python中的encode方法对它们进行编码,然后再将它们放回原处。

当我尝试转换在设置更改后插入的、已经正确的值时,就会出现问题。

有没有好的方法来决定我是否应该对这个值进行编码?

EN

回答 1

Stack Overflow用户

发布于 2012-08-14 17:59:28

你以前的编码大概是拉丁语1?

您可能可以通过查看连续的字节来检测一个字符串是用拉丁语-1而不是UTF-8编码的。UTF-8标准有一个distinctive codepage layout,我们可以用它来检测一段文本是用拉丁文-1还是用UTF-8编码的:

  • 00-7F范围内的任何字节都是安全的,当然,这些是ASCII值,并且这些码点在两种编码之间是匹配的。
  • 字节C0,C1和F5-FF在UTF-8编码中是非法的。任何包含这些字符的字符串都必须是拉丁-1编码的。C2-DF范围内的
  • 字节后面必须跟80-BF范围内的字节。如果您有任何两个字节与此不匹配,则很可能手头有一个拉丁-1编码的字符串。

如果您所编码的都是拉丁-1字符(直到Unicode代码点255),那么您可以停在这里;任何包含E0-FF范围内的字节的数据都将是旧的拉丁-1数据。

如果您在切换后添加了UTF-8格式的数据,这超出了拉丁-1范围,则还需要包括以下规则:

E0-EF范围内的

  • 字节标记一个3字节的UTF-8字符。接下来的两个字节必须再次落在80-BF范围内。

3UTF-8字节数据覆盖了BMP的其余部分,您不太可能在此之外进行编码。但是,如果您确实在此之外进行编码,请查找:

F0-F4范围内的

  • 字节后面必须紧跟80-BF范围内的3个字节。

如果所有这些条件都匹配,您可能有一个UTF-8字符串,但您不能100%确定。如果它们中的任何一个不匹配,您肯定有一个拉丁-1字符串。但是,拉丁文-1代码点C2-DF不太可能被代码点80-BF跟随,因为后者中的大多数要么是控制代码,要么是更深奥的变音标记。也许您可以通过寻找多个2字节的UTF-8序列来进一步缩小范围,以增加您的置信度分数。

因此,总而言之(tl;dr):您可以通过查看多字节序列找到大多数拉丁文-1编码的字符串。如果它们不符合严格的UTF-8标准,那么您手头上就有一个拉丁-1字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11949005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档