如何在 python 中正确打印 unicode 字符列表?

How to properly print a list of unicode characters in python?

我正在尝试搜索 python 字符串中的表情符号。 所以我有,例如,

em_test = ['\U0001f680']
print(em_test)
['']
test = 'This is a test string '
if any(x in test for x in em_test):
    print ("yes, the emoticon is there")
else: 
    print ("no, the emoticon is not there")

yes, the emoticon is there

如果在

中搜索 em_test

'This is a test string '

我居然能找到

所以我制作了一个 csv 文件,其中包含我想要的所有表情符号,这些表情符号由它们的 unicode 定义。 CSV 看起来像这样:

\U0001F600

\U0001F601

\U0001F602

\U0001F923

当我导入并打印它时,我实际上没有得到表情符号,而只是文本表示:

['\U0001F600',
 '\U0001F601',
 '\U0001F602',
 '\U0001F923',
...
]

因此我无法使用它在另一个字符串中搜索这些表情符号... 我不知何故知道双反斜杠 \ 只是单斜杠的表示,但不知何故 unicode reader 不明白......我不知道我错过了什么。

有什么建议吗?

1.保持你的 csv 原样:

这是一个臃肿的解决方案,但使用 ast.literal_eval 有效:

import ast

s = '\U0001F600'

x = ast.literal_eval('"{}"'.format(s))
print(hex(ord(x)))
print(x)

我得到 0x1f600(这是正确的字符代码)和一些表情符号字符 ()。 (好吧,我不得不 copy/paste 从我的控制台到这个答案文本字段的一个奇怪的字符,但这是我最后的控制台问题,否则有效)

只需用引号引起来,以允许 ast 将输入作为字符串。

2。直接使用字符代码

也许您最好自己存储字符代码而不是 \U 格式:

print(chr(0x1F600))

完全一样(所以 ast 有点矫枉过正)

您的 csv 可能包含:

0x1F600
0x1F601
0x1F602
0x1F923

然后 chr(int(row[0],16)) 会在阅读时发挥作用:例如,如果 CSV 中有一行(或第一行)

with open("codes.csv") as f:
   cr = csv.reader(f)
   codes = [int(row[0],16) for row in cr]

您可以使用 .decode('unicode-escape') 解码那些 Unicode 转义序列。但是,.decode 是一种 bytes 方法,因此如果这些序列是文本而不是字节,您首先需要将它们编码为字节。或者,您可以(可能)以二进制模式打开 CSV 文件,以便将这些序列读取为 bytes 而不是文本字符串。

为了好玩,我也将使用 unicodedata 来获取那些表情符号的名称。

import unicodedata as ud

emojis = [
    '\U0001F600',
    '\U0001F601',
    '\U0001F602',
    '\U0001F923',
]

for u in emojis:
    s = u.encode('ASCII').decode('unicode-escape')
    print(u, ud.name(s), s)

输出

\U0001F600 GRINNING FACE 
\U0001F601 GRINNING FACE WITH SMILING EYES 
\U0001F602 FACE WITH TEARS OF JOY 
\U0001F923 ROLLING ON THE FLOOR LAUGHING 

这应该比使用 ast.literal_eval 快得多。如果您以二进制模式读取数据,它会更快,因为它避免了读取文件时的初始解码步骤,并允许您消除 .encode('ASCII') 调用。

您可以使用

使解码更加稳健
u.encode('Latin1').decode('unicode-escape')

但这对于您的表情符号数据来说不是必需的。正如我之前所说,如果您以二进制模式打开文件以避免对其进行编码,那就更好了。