Python 打印带有U+的家庭表情符号;200D零宽度连接件,直接连接,vs通过列表

Python 打印带有U+的家庭表情符号;200D零宽度连接件,直接连接,vs通过列表,python,python-3.x,unicode,emoji,Python,Python 3.x,Unicode,Emoji,我发现在通过打印直接打印带有家族表情符号的字符串时,以及在列表中打印时,存在一些意想不到的差异。下面的程序 family='如注释中所述,区别在于print(family)调用str.\uu str.\uuuuu方法,而print([family])调用str.\uu repr.\uuu,后者转义不可打印的unicode字符 print函数使用str转换其(非关键字)参数 对容器调用str(通常)对其项目调用repr。这主要是因为容器中的字符串太容易干扰容器本身的表示(例如,使用换行符)。在Py

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


family='如注释中所述,区别在于
print(family)
调用
str.\uu str.\uuuuu
方法,而
print([family])
调用
str.\uu repr.\uuu
,后者转义不可打印的unicode字符

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

  • 对容器调用
    str
    (通常)对其项目调用
    repr
    。这主要是因为容器中的字符串太容易干扰容器本身的表示(例如,使用换行符)。在Python3发行版前后,提出了一个改变这一点的PEP,但是

  • 对字符串调用
    repr
    会转义任何不可打印的字符(但从Python 3开始,会保留其他非ASCII Unicode字符):请参阅和的说明

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


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

    这是基于直觉,但是由于python将字符串存储为单个的
    代码点
    而不是
    图形集
    ,所以这种明显的现象可能是由于解析器缓冲输出时产生的一些随机边缘情况造成的
    )具有一组预定义的字符,这些字符显示为转义序列。它们似乎很难看到空白字符和零宽度字符
    200D
    显然是其中之一,但修饰符通常是逐字打印的。这都是基于观察,我还没有找到这方面的书面来源。我认为repr使用ASCII编码打印。第417行表示类似行为与正常行为相同,请尝试
    print(['a','b','c'])
    vs
    print('abc')
    。这是一个不可打印的字符<因此,它被转换为转义的unicode文本。Python对每个代码点迭代unicode。即使使用unicode,也会发生这种情况,因此这不是ascii相关行为。在python的interactive中使用它,使其更易于查看。考虑一下
    type(1)#int
    vs
    type([1])#list
    print(repr(“\N{MAN}”))
    打印字形的行为,所以我认为内置的不适用。