我正在尝试查询并显示在tkinter上构建的gui中的utf-8编码字符,从而显示tcl。但是,我发现tkinter不能显示4字节字符,即大于U + FFFF的unicode代码点。 为什么会这样?实施非BMP字符对tcl有什么限制?
我无法通过我的gui查询非BMP字符,但如果他们出现在结果中我可以复制/粘贴字符并通过unicode-table.com查看字符/代码点,尽管我的系统没有显示它。因此,似乎该字符显示为代码点U + FFFD,但存储在具有正确代码点的视图中。
我在Windows 7上运行Python 3.6.4脚本。
更新:以下是我在4字节unicode代码点超出BMP字符范围且无法通过Tcl处理的情况下获得的错误
File "Project/userInterface.py", line 569, in populate_tree
iids.append(self.detailtree.insert('', 'end', values=entry))
File "C:\Program Files (x86)\Python36-32\Lib\tkinter\ttk.py", line 1343, in insert
res = self.tk.call(self._w, "insert", parent, index, *opts)
_tkinter.TclError: character U+1f624 is above the range (U+0000-U+FFFF) allowed by Tcl
我通过使用正则表达式用替换字符替换范围外的unicode字符来处理这个问题。
for item in entries:
#handles unicode characters that are greator than 3 bytes as tkinter/tcl cannot handle/display them
entry = list(item)
for i, col in enumerate(entry):
if col and isinstance(col, str):
re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
filtered_string = re_pattern.sub(u'\uFFFD', col) #replaces \u1000 and greater with the unknow character
if filtered_string != col:
entry[i] = filtered_string
entry = tuple(entry)
iids.append(self.detailtree.insert('', 'end', values=entry))