Python - 用 ASCII 字符替换 unicode 表情符号
Python - replace unicode emojis with ASCII characters
我目前的一个周末项目有问题。我正在编写一个 Python 脚本,它从不同的来源获取一些数据,然后将所有数据输出到 esc-pos 打印机。正如您想象的那样,pos 打印机并不完全像表情符号...
这样的文字:
可爱!!!!!!!!
给我这个字符串:
'\u53ef\u7231!!!!!!!!\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f61d'
打印机输出的结果当然与我想要的完全不同。所以我需要用其他东西替换这些非 ASCII 字符。我不太关心第一个字符,但我确实关心表情符号。使用类似:unidecode(str(text))
至少会去除它们,但我想将它们转换为更有用的东西。要么变成像 [:-D] 这样的经典笑脸,要么变成 [心形眼睛的笑脸]。
我的问题是...如何才能做到这一点?为最常见的表情符号手动创建查找 table 似乎有点乏味,所以我想知道是否还有其他我可以做的事情。
试试这个
import unicodedata
print( unicodedata.name(u'\U0001f60d'))
结果是
SMILING FACE WITH HEART-SHAPED EYES
根据有关 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 !!!!!!!![SMILING FACE WITH HEART-SHAPED
EYES][SMILING FACE WITH HEART-SHAPED EYES][SMILING FACE WITH
HEART-SHAPED EYES][SMILING FACE WITH HEART-SHAPED EYES][SMILING FACE
WITH HEART-SHAPED EYES][SMILING FACE WITH HEART-SHAPED EYES][SMILING
FACE WITH HEART-SHAPED EYES][FACE WITH STUCK-OUT TONGUE AND
TIGHTLY-CLOSED EYES]
我遇到了同样的问题并使用以下功能解决了它:
import demoji
def deEmojify(inputString):
return demoji.replace_with_desc(inputString.encode('utf-16', 'surrogatepass').decode('utf-16'))
我目前的一个周末项目有问题。我正在编写一个 Python 脚本,它从不同的来源获取一些数据,然后将所有数据输出到 esc-pos 打印机。正如您想象的那样,pos 打印机并不完全像表情符号...
这样的文字:
可爱!!!!!!!!
给我这个字符串:
'\u53ef\u7231!!!!!!!!\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f60d\U0001f61d'
打印机输出的结果当然与我想要的完全不同。所以我需要用其他东西替换这些非 ASCII 字符。我不太关心第一个字符,但我确实关心表情符号。使用类似:unidecode(str(text))
至少会去除它们,但我想将它们转换为更有用的东西。要么变成像 [:-D] 这样的经典笑脸,要么变成 [心形眼睛的笑脸]。
我的问题是...如何才能做到这一点?为最常见的表情符号手动创建查找 table 似乎有点乏味,所以我想知道是否还有其他我可以做的事情。
试试这个
import unicodedata
print( unicodedata.name(u'\U0001f60d'))
结果是
SMILING FACE WITH HEART-SHAPED EYES
根据有关 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 !!!!!!!![SMILING FACE WITH HEART-SHAPED EYES][SMILING FACE WITH HEART-SHAPED EYES][SMILING FACE WITH HEART-SHAPED EYES][SMILING FACE WITH HEART-SHAPED EYES][SMILING FACE WITH HEART-SHAPED EYES][SMILING FACE WITH HEART-SHAPED EYES][SMILING FACE WITH HEART-SHAPED EYES][FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES]
我遇到了同样的问题并使用以下功能解决了它:
import demoji
def deEmojify(inputString):
return demoji.replace_with_desc(inputString.encode('utf-16', 'surrogatepass').decode('utf-16'))