【问题标题】:Convert "\xF0\x9D\x96\xA7\xF0\x9D" to "normal" string in Python在 Python 中将“\xF0\x9D\x96\xA7\xF0\x9D”转换为“普通”字符串
【发布时间】:2021-12-29 00:57:09
【问题描述】:

(注意,我不是 100% 确定字符串是如何编码的,不同编码方案之间的区别等。因此我可能会在这里问一个愚蠢的问题。我使用 VScode 作为 IDE 和 Python 3.8.1)

我今天遇到了一个问题,客户向我们发送了一封电子邮件。我从 Zendesk 的 API 中提取了电子邮件,并希望将其存储在我们的 MySQL 数据库中。我在推送时收到了这个incorrect string value '\xF0\x9D\x96\xA7\xF0\x9D' 错误,这很奇怪,因为电子邮件正文只是像Hello - where is my package?(另一种语言)这样的纯文本。过了一会儿,我注意到所有字母看起来都不像“普通字符串字母”,结果发现电子邮件中的Hello 不等于"Hello"email_body[:5]=="Hello" 是假的(可能使用了一些奇怪的字体电子邮件?)。对正文进行编码表明,正文确实以\xF0\x9D\x96\xA7\xF0\x9D 开头,而不是“Hello”

问题是,如上所示,邮件中的"Hello" 不等于“普通”"Hello",因此我无法比较字符串、进行字符串操作等。

有没有办法将我从电子邮件正文中得到的“Hello”转换为普通字符串,使两个“Hello”字符串再次相等?

【问题讨论】:

  • 您可以使用unidecode module,但我怀疑这不是您真正想要的。
  • 如果它可以转换以奇怪方式编码的电子邮件(可能是因为字体?)那么我当然愿意接受建议
  • 您可能有多个问题。这看起来不像 Unicode 字符串,它看起来像字节字符串 - 在您知道它的编码之前,您将无法到达任何地方。
  • 正如@Mark Ransom 所说,我们需要查看原始文本,Hello 字符串之前是否有任何特殊字符。
  • 前 4 个字节是 U+15AD7 MATHEMATICAL SANS-SERIF CAPITAL H,UTF-8 编码。

标签: python utf-8 character-encoding


【解决方案1】:

如 cmets 中所述,字符串以 Unicode 字符 U+15AD7 MATHEMATICAL SANS-SERIF CAPITAL H 开头,它看起来像普通的 H,但却是一个不同的字符。

来自 MySQL 的错误消息可能是由于您的 MySQL 表使用 utf8 编码而不是 utf8mb4 造成的。后者需要存储基本多语言平面之外的 Unicode 字符(代码点大于 0xFFFF)。

您可以通过使用 NFKC 等兼容性规范化形式进行规范化,将 U+15AD7 MATHEMATICAL SANS-SERIF CAPITAL H 转换为 U+0048 LATIN CAPITAL LETTER H,但这不会解决底层数据库问题:

import unicodedata
s = b"\xF0\x9D\x96\xA7".decode()
n = unicodedata.normalize('NFKC', s)
print(n, '%04x'%ord(n))  # Should print "H 0048"

【讨论】:

  • 其实它只是打印“H”
猜你喜欢
  • 2015-03-07
  • 2020-02-20
  • 2013-12-23
  • 2012-11-19
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多