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



我发现,通过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。

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

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

  2. 对容器调用str(通常)调用其项目repr。主要是因为容器内的字符串太容易干扰容器本身的呈现(例如换行符)。在Python 3发布时提出了改变这一点的PEP,但很快就被拒绝了。

  3. 对字符串调用repr会转义任何不可打印的字符(但从 Python 3 开始,保留其他非 ASCII Unicode 字符):请参阅 PEP-3138 和 str.isprintable 的描述

如果字符串中的所有字符都可打印或字符串为空,则返回 true,否则返回 false。不可打印字符是指在 Unicode 字符数据库中定义为"其他"或"分隔符"的字符,ASCII 空格 (0x20) 除外,该空格被视为可打印。(请注意,此上下文中的可打印字符是在字符串上调用 repr() 时不应转义的字符。它与写入 sys.stdout 或 sys.stderr 的字符串的处理无关。

CPython实现可以在这里找到(搜索unicode_repr函数)。

相关内容

  • 没有找到相关文章

最新更新