使用U + 200D零宽度连接器直接打印系列表情符号,通过列表

时间:2018-04-21 17:14:28

标签: python python-3.x unicode emoji

我通过print直接打印带有系列表情符号的字符串,以及列表中的字符串时,发现了一些意想不到的差异。以下程序

family = '‍‍‍'
print(family)
print([family])

输出

‍‍‍
['\u200d\u200d\u200d']

当我希望它输出时

‍‍‍
['‍‍‍']

多字符字形的另一种情况

man_with_skin_tone_modifier = ''
print(man_with_skin_tone_modifier)
print([man_with_skin_tone_modifier])
按照我的预期输出:


['']

为什么会这样?

上下文:我在为https://stackoverflow.com/a/49930688/1319998编写答案时发现了这一点,并在OS X上使用Python 3.6.5。

1 个答案:

答案 0 :(得分:2)

如注释中所述,区别在于print(family)调用str.__str__方法,而print([family])调用str.__repr__,该方法转义了不可打印的Unicode字符。 / p>

  1. print函数使用str转换其(非关键字)参数。

  2. 在容器上调用str(通常)在其项目上调用repr。通常这是因为容器内的字符串很容易打乱容器本身的显示方式(例如,使用换行符)。在Python 3发行版(但quickly rejected)周围提出了PEP来改变这一点。

  3. 在字符串上调用repr会转义所有不可打印的字符(但是,从Python 3开始,会保留其他非ASCII Unicode字符):请参见PEP-3138和{{3的说明}}

  

如果字符串中的所有字符均可打印或字符串为空,则返回true,否则返回false。不可打印字符是在Unicode字符数据库中定义为“其他”或“分隔符”的那些字符,但认为可打印的ASCII空间(0x20)除外。 (请注意,在这种情况下,可打印字符是在字符串上调用repr()时不应转义的字符。。它与写入sys.stdout或sys.stderr的字符串的处理没有关系。 )

可以找到str.isprintable(搜索unicode_repr函数)的CPython实现。