我通过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。
答案 0 :(得分:2)
如注释中所述,区别在于print(family)
调用str.__str__
方法,而print([family])
调用str.__repr__
,该方法转义了不可打印的Unicode字符。 / p>
print
函数使用str
转换其(非关键字)参数。
在容器上调用str
(通常)在其项目上调用repr
。通常这是因为容器内的字符串很容易打乱容器本身的显示方式(例如,使用换行符)。在Python 3发行版(但quickly rejected)周围提出了PEP来改变这一点。
在字符串上调用repr
会转义所有不可打印的字符(但是,从Python 3开始,会保留其他非ASCII Unicode字符):请参见PEP-3138和{{3的说明}}
如果字符串中的所有字符均可打印或字符串为空,则返回true,否则返回false。不可打印字符是在Unicode字符数据库中定义为“其他”或“分隔符”的那些字符,但认为可打印的ASCII空间(0x20)除外。 (请注意,在这种情况下,可打印字符是在字符串上调用repr()时不应转义的字符。。它与写入sys.stdout或sys.stderr的字符串的处理没有关系。 )
可以找到str.isprintable(搜索unicode_repr函数)的CPython实现。