如何在python中获取正确的unicode字符列表

时间:2017-11-13 11:55:36

标签: python string unicode emoticons

我正在尝试在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
  

'这是一个测试字符串'

我实际上可以找到它。

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

  

\ U0001F600

     

\ U0001F601

     

\ U0001F602

     

\ U0001F923

当我导入并打印它时,我不会获得表情符号而只是文本表示:

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

因此我不能用它在另一个字符串中搜索这些表情符号... 我不知何故知道双反斜杠\只是单斜杠的表示,但不知何故unicode阅读器没有得到它......我不知道我错过了什么。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以使用.decode('unicode-escape')解码这些Unicode转义序列。但是,.decodebytes方法,因此如果这些序列是文本而不是字节,则首先需要将它们编码为字节。或者,您可以(可能)以二进制模式打开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')

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

答案 1 :(得分:1)

<强> 1。保持你的csv原样:

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

import ast

s = '\\U0001F600'

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

我得到0x1f600(这是正确的字符代码)和一些表情字符()。 (好吧,我必须将一个奇怪的字符从我的控制台复制/粘贴到这个答案文本字段,但这是我最终的控制台问题,否则可行)

只是用引号括起来允许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]