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

use*_*900 4 python unicode emoji

我当前的一个周末项目有一个问题。我正在编写一个Python脚本,该脚本从不同的来源获取一些数据,然后将所有内容吐给esc-pos打印机。您可能会想到pos打印机与emoji表情不完全一样...

所以这样的文字:

??!!!!!!!!
Run Code Online (Sandbox Code Playgroud)

给我这个字符串:

'\u53ef\u7231!!!!!!!!\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f61d'
Run Code Online (Sandbox Code Playgroud)

打印机输出的结果与我当然想要的完全不同。所以我需要用其他东西代替这些非ASCII字符。我不太在乎第一个字符,但我确实在乎表情符号。使用类似的东西:unidecode(str(text))至少会去除它们,但是我想将它们转换为更有用的东西。可以进入[:-D]之类的经典表情符号,也可以进入[带有心形眼睛的笑脸]。

我的问题是...该怎么做?手动为最常见的表情符号创建查找表似乎有些乏味,因此我想知道是否还有其他事情可以做。

use*_*900 5

通过技巧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
Run Code Online (Sandbox Code Playgroud)

基本上,它首先尝试找到最合适的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))
Run Code Online (Sandbox Code Playgroud)

将产生以下结果:

abcdsedfcgzhAiOjAEk [x] Ke Ai !!!!!!!! [带有心形眼睛的笑脸] [带有心形眼睛的笑脸] [带有心形眼睛的笑脸] [带有心形眼睛的笑脸] [带有心形眼睛的笑脸] [带有心形眼睛的笑脸] [带有心形眼睛的微笑脸] [带有伸出舌头和密闭眼睛的脸]