如何在 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')
但这对于您的表情符号数据来说不是必需的。正如我之前所说,如果您以二进制模式打开文件以避免对其进行编码,那就更好了。
我正在尝试搜索 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')
但这对于您的表情符号数据来说不是必需的。正如我之前所说,如果您以二进制模式打开文件以避免对其进行编码,那就更好了。