Python - 用ASCII字符替换Unicode表情符号

6

我有一个问题,涉及我的一个周末项目。我正在编写一个Python脚本,从不同的数据源获取一些数据,然后将所有内容输出到一个ESC-POS打印机。正如你所想象的那样,POS打印机并不喜欢表情符号...

因此,像这样的文本:

可爱!!!!!!!!

给我这个字符串:

'\u53ef\u7231!!!!!!!!\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f61d'

打印出来的结果与我想要的完全不同。所以我需要用其他字符替换这些非ASCII字符。我并不在意第一个字符,但我很在意表情符号。使用类似于:unidecode(str(text)) 的方法至少可以将它们删除,但我想将它们转换为更有用的东西。可以转换为经典的笑脸符号,如[:-D],或者转换成[眼睛形状的微笑脸]。
我的问题是...怎么做呢?手动创建大多数常见表情符号的查找表似乎有点费力,所以我想知道是否还有其他方法。

你可以期望使用一个库,或者自己做繁琐的工作。这里有一个可能会有所帮助的库:https://pypi.python.org/pypi/emoji。 - user3591723
3个回答

8

有了关于unicodedata.name的提示和进一步的研究,我成功地把这个东西组合在一起:

import unicodedata
from unidecode import unidecode

def deEmojify(inputString):
    returnString = ""

    for character in inputString:
        try:
            character.encode("ascii")
            returnString += character
        except UnicodeEncodeError:
            replaced = unidecode(str(character))
            if replaced != '':
                returnString += replaced
            else:
                try:
                     returnString += "[" + unicodedata.name(character) + "]"
                except ValueError:
                     returnString += "[x]"

    return returnString

基本上,它首先尝试找出最适合的ASCII表示方式,如果失败了,则尝试使用Unicode名称,如果仍然失败,则只是用一些简单的标记替换它。

例如,取这个字符串:

abcdšeđfčgžhÅiØjÆk 可爱!!!!!!!!

并运行该函数:

string = u'abcdšeđfčgžhÅiØjÆk \u53ef\u7231!!!!!!!!\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f61d'
print(deEmojify(string))

将会产生以下结�:

abcdsedfcgzhAiOjAEk[x] Ke Ai !!!!!!!!�������🤪


3

试试这个

import unicodedata
print( unicodedata.name(u'\U0001f60d'))

结果为

SMILING FACE WITH HEART-SHAPED EYES

0

我遇到了同样的问题,并使用以下函数解决了它:

import demoji

def deEmojify(inputString):
    return demoji.replace_with_desc(inputString.encode('utf-16', 'surrogatepass').decode('utf-16'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接