【问题标题】:Why some emojis are not converted back into their representation?为什么有些表情符号没有转换回它们的表示形式?
【发布时间】:2020-08-15 02:28:49
【问题描述】:

我正在开发表情符号检测模块。对于某些表情符号,我观察到奇怪的行为,即在将它们转换为 utf-8 编码后,它们没有转换回其原始表示形式。我需要将它们的确切颜色表示作为 API 响应发送,而不是发送 unicode 转义字符串。有什么线索吗?

In [1]: x = "example1: ???? and example2: ???? and example3: ????" 

In [2]: x.encode('utf8')                                                                                                                                                                                                          
Out[2]: b'example1: \xf0\x9f\xa4\xad and example2: \xf0\x9f\x98\x81 and example3: \xf0\x9f\xa5\xba'

In [3]: x.encode('utf8').decode('utf8')                                                                                                                                                                                           
Out[3]: 'example1: \U0001f92d and example2: ???? and example3: \U0001f97a'

In [4]: print( x.encode('utf8').decode('utf8')  )                                                                                                                                                                                 
*example1: ???? and example2: ???? and example3: ????*

Link Emoji used in example

更新 1: 通过这个例子,它必须更清楚地解释。在这里,当我发送 unicode 转义字符串时,会呈现两个表情符号,但第三个示例无法转换精确的表情符号,这种情况下该怎么办?

【问题讨论】:

  • x.encode('utf8').decode('utf8')==xTrue。似乎是什么问题?
  • @DYZ 我知道它们是一样的,但我想以表情符号的形式存储它,而不是 Unicode 转义序列。
  • 字符串在两种情况下都包含相同的数据。您不是“存储 unicode 转义序列”,而是 显示字符串中单个正确代码点的 Unicode 转义序列。

标签: python-3.x unicode utf-8 python-unicode unicode-escapes


【解决方案1】:

'\U0001f92d' == '?'True。它是一个转义码,但仍然是同一个字符......两种显示/输入方式。前者是字符串的repr(),打印调用str()。示例:

>>> s = '?'
>>> print(repr(s))
'\U0001f92d'
>>> print(str())
?
>>> s
'\U0001f92d'
>>> print(s)
?

当 Python 生成 repr() 时,如果它认为显示器无法处理字符,它会使用转义码表示。字符串的内容还是一样的……Unicode码位。

这是一个调试功能。例如,空格是空格还是制表符?字符串的repr() 通过使用\t 作为转义码来明确。

>>> s = 'a\tb'
>>> print(s)
a       b
>>> s
'a\tb'

至于为什么一个表情符号使用转义码而不是另一个,这取决于使用的 Python 版本支持的 Unicode 版本。

Pyton 3.8 使用 Unicode 9.0,您的表情符号之一未在该版本级别定义:

>>> import unicodedata as ud
>>> ud.unidata_version
'9.0.0'
>>> ud.name('?')
'GRINNING FACE WITH SMILING EYES'
>>> ud.name('?')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: no such name

【讨论】:

  • 我知道它们是相同的并且是平等的。问题是为什么有些表情符号以 ? 格式显示,而有些则表示为 unicode 转义。为什么不对所有人遵循相同的行为?
  • @Osama unicodedata 模块提供有关代码点的信息。我使用的是 Python 3.8.2,它支持 Unicode 9.0。它在该数据库中没有 ? 的名称,因此它可能是一个新的 Unicode 字符。 Python 由于其数据库认为它是一个未定义的字符,所以使用转义码进行调试显示。
  • 我添加了一些图片来显示这些表情符号是如何在我的 API 响应中呈现的。我明白你的意思了,有什么解决办法吗?
  • 这是一个渲染问题,而不是 Python 问题。向 IDE 供应商投诉。 U+1F97A 在Unicode 11.0 中定义。 Python和用于渲染的终端,字体需要支持该级别的标准才能正确显示。
  • @Osama 另请注意,Python 正在正确存储/编码/解码代码点,即使它不知道代码点代表什么。这纯粹是一个渲染问题。
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多