unicode - 如何在 Tkinter 中打印非 BMP Unicode 字符(例如 𝄫)

标签 unicode utf-8 tkinter tcl python-3.4

注意:Python 3.8 开始,非 BMP 字符可以在 IDLE 中显示(因此,Tkinter 现在也可能会显示它们,因为它们都使用 TCL),这是在我发布此问题一段时间后发布的。我计划在尝试 Python 3.9 后(安装更新版本的 Xubuntu 后)编辑此内容。我还读到在 IDLE 中编辑这些角色可能不像其他角色那么简单; see the last comment here .

<小时/>

所以,今天我正在制作输入某些 Unicode 字符的快捷方式。一切都很顺利。然后,当我决定执行这些字符(在我的 Tkinter 程序中;它们甚至不会尝试进入 IDLE)、𝄫 和 𝄪 时,我遇到了一个奇怪的意外错误,我的程序开始删除我在文本框。这是 Not Acceptable 。

错误如下: _tkinter.TclError:字符 U+1d12b 超出 Tcl 允许的范围 (U+0000-U+FFFF)

我意识到我使用的大多数 Unicode 字符在代码中只有四个字符。由于某种原因,它不喜欢五个。

那么,有什么方法可以在 ScrolledText 小部件中打印这些字符(更不用说不弄乱其他所有内容了)?

UTF-8是我的编码。我使用的是 Python 3.4(因此 UTF-8 是默认值)。

我可以使用 print 语句很好地打印这些字符。

不使用 ScrolledText.insert 输入字符(例如 Ctrl-shift-u,或在代码中执行此操作:b'\xf0\x9d\x84\xab') 确实输入了它,没有那个错误,但它仍然开始疯狂地删除东西,或者添加额外的空格(包括它自己,尽管它有时会随机重新出现)。

最佳答案

目前无法显示这些字符,因为它们应该在 Python 3.4 的 Tkinter 中查看(尽管有人提到[在 Python 2.x 中]如何使用代理对)。但是,您可以实现将字符转换为可显示代码并返回的方法,并在需要时调用它们。当您打印到文本小部件、复制/粘贴、文件对话框*、选项卡栏、状态栏和其他内容时,您必须调用它们。

*默认的 Tkinter 文件对话框不允许对对话框进行太多内部工程。我制作了自己的文件对话框,部分是为了帮助解决这个问题。如果您有兴趣,请告诉我。希望我将来能在这里发布它们的代码。

这些方法将超出范围的字符转换为代码,反之亦然。这些代码采用序数格式,如下所示:{119083ū}。括号和 ū 只是为了将其区分为代码。 {119083ū} 代表 𝄫。正如你所看到的,我还没有考虑如何转义代码,尽管我确实有目的地尝试使代码不太可能发生。转换时使用的 ᗍ119083ūᗍ 也是如此。不管怎样,我的意思是最终添加转义序列。这些方法取 self 的类(因此是 self)。 (是的,我知道你不必在 Python 中使用分号。我只是喜欢它们,并认为它们在某些情况下使代码更具可读性。)

import re;

def convert65536(self, s):
    #Converts a string with out-of-range characters in it into a string with codes in it.
    l=list(s);
    i=0;
    while i<len(l):
        o=ord(l[i]);
        if o>65535:
            l[i]="{"+str(o)+"ū}";
        i+=1;
    return "".join(l);
def parse65536(self, match):
    #This is a regular expression method used for substitutions in convert65536back()
    text=int(match.group()[1:-2]);
    if text>65535:
        return chr(text);
    else:
        return "ᗍ"+str(text)+"ūᗍ";
def convert65536back(self, s):
    #Converts a string with codes in it into a string with out-of-range characters in it
    while re.search(r"{\d\d\d\d\d+ū}", s)!=None:
        s=re.sub(r"{\d\d\d\d\d+ū}", self.parse65536, s);
    s=re.sub(r"ᗍ(\d\d\d\d\d+)ūᗍ", r"{\1ū}", s);
    return s;

关于unicode - 如何在 Tkinter 中打印非 BMP Unicode 字符(例如 𝄫),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530080/

相关文章:

mysql - nodejs-mysql 文件中无效的 utf8 字符字符串加载数据

python - 在 Tkinter 的另一个函数中使用条目/按钮中的变量

java - iText 中的高棉语 Unicode

python - 如何在 python 中处理 unicode 语言

java - 通过 MYSQL 存储过程通过 JDBC 插入韩文字符出错

python - 将 Tkinter slider 链接到文本输入

python - 获取 Tkinter 文本小部件中最后一个字符的位置

delphi - 将 RTF 文本从数据库加载到 TRichEdit

unicode - ASCII 与 Unicode + UTF-8

python - 类型错误 : decoding str is not supported (Python 3. 4)