在Python 3中删除BMP(表情符号)外的字符

4

我遇到了一个错误:UnicodeEncodeError: 'UCS-2'编解码器无法对Tk中的位置266-266的字符进行编码:不支持非BMP字符

我正在解析数据,但有些表情符号会落到数组中。 data = 'this variable contains some emoji'sツ' 我想要的是:data = 'this variable contains some emoji's'

我该如何从我的数据中删除这些字符或在Python 3中处理这种情况?


3
需要翻译的内容:How about some relevant pieces of code?...and is this related to Tkinter ?您需要一些相关的代码吗?这是否与Tkinter有关? - Iron Fist
我正在解析数据,一些表情符号被放入了数组中。 数据 = '这个变量包含一些表情符号ツ' 我想要的是: 数据 = '这个变量包含一些表情符号' - pachvo
1
ツ不是一个表情符号,它在BMP内部。您也想将其删除吗? - deceze
2个回答

11

如果目标只是删除所有在'\uFFFF'上方的字符,那么直接的做法就是这样:

data = "this variable contains some emoji'sツ"
data = ''.join(c for c in data if c <= '\uFFFF')

可能你的字符串处于分解形式,因此你可能需要首先将其规范化为组合形式,以便非BMP字符可以被识别:

import unicodedata

data = ''.join(c for c in unicodedata.normalize('NFC', data) if c <= '\uFFFF')

由于某些原因,这在Python 2.7.5中对我不起作用。(我尝试了两种解决方案。)小写字符被剥离了。相反,我使用了re_pattern = re.compile(u'[^\u0000-\uFFFF]', re.UNICODE); data = re_pattern.sub('', data) - Eric Klien
@EricKlien:这个答案是针对Python 3的;如果你在Python 2中尝试使用它而没有加上u前缀,它会生成str而不是unicode,比较将无法工作。您的输入需要被转换为unicode,并且被测试的文字需要加上u前缀,使其变成u'\uFFFF'。如果您这样做,它就可以正常工作 - ShadowRanger

-2

2
那将消除任何可打印的ASCII范围之外的内容,而不仅仅是BMP之外的内容。此外,在Python 3中,filter始终返回生成器,而不是通过参数类型的str/tuple/list。最后,如果需要一个lambda来完成它,不要费力使用filter/map; genexpr / listcomp将更快,更简洁。''.join(x for x in data if x in printable)(尽管在这种情况下,''.join(filter(printable.__contains__, data)) 将获得lambda版本没有的速度)。 - ShadowRanger
是的...我也想评论一下...只有可打印的ASCII范围。 - Iron Fist
@ShadowRanger 哎呀...我以为他想要删除所有非ASCII字符,而不仅仅是BMP...抱歉。 - Maciej A. Czyzewski

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