我遇到了一个错误:UnicodeEncodeError: 'UCS-2'编解码器无法对Tk中的位置266-266的字符进行编码:不支持非BMP字符
我正在解析数据,但有些表情符号会落到数组中。 data = 'this variable contains some emoji'sツ'
我想要的是:data = 'this variable contains some emoji's'
我该如何从我的数据中删除这些字符或在Python 3中处理这种情况?
我遇到了一个错误:UnicodeEncodeError: 'UCS-2'编解码器无法对Tk中的位置266-266的字符进行编码:不支持非BMP字符
我正在解析数据,但有些表情符号会落到数组中。 data = 'this variable contains some emoji'sツ'
我想要的是:data = 'this variable contains some emoji's'
我该如何从我的数据中删除这些字符或在Python 3中处理这种情况?
如果目标只是删除所有在'\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')
re_pattern = re.compile(u'[^\u0000-\uFFFF]', re.UNICODE); data = re_pattern.sub('', data)
。 - Eric Klienu
前缀,它会生成str
而不是unicode
,比较将无法工作。您的输入需要被转换为unicode
,并且被测试的文字需要加上u
前缀,使其变成u'\uFFFF'
。如果您这样做,它就可以正常工作。 - ShadowRanger>>> import string
>>> printable = set(string.printable)
>>> filter(lambda x: x in printable, data)
"this variable contains some emoji's"
有关 BMP 的阅读,请参考此链接: 在 Python 中从字符串中删除表情符号
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
Tkinter
?您需要一些相关的代码吗?这是否与Tkinter
有关? - Iron Fist