【问题标题】:How do I get tkinter to display these unicode characters?如何让 tkinter 显示这些 un​​icode 字符?
【发布时间】:2016-04-30 04:32:23
【问题描述】:

我正在努力让它正确显示

unicode: ?????????????????????????????????????????? ?????????.????????????

嗯,这个字符范围。这是'Mathematical Alphanumeric Symbols Unicode block'。 关于这些字符,他们为一个字母使用了两个转义符,所以有点奇怪

???????????????????????????????????????????????? ?????.???????????? = \uD835\uDC12\uD835\uDC13\uD835\uDC00\uD835\uDC02\uD835\uDC0A\uD835\uDC0E\uD835\uDC15\uD835\uDC04\uD835\uDC11\uD835\uDC05\uD835\uDC0B\uD8 uD835\uDC16.\uD835\uDC02\uD835\uDC0E\uD835\uDC0C

无论如何,它们实际上正确地输出到我的程序中,但它们不显示。 通过谷歌搜索,我发现 tkinter 和 unicode 支持存在一些问题。 Picture related.

我该怎么办?

【问题讨论】:

    标签: python windows python-3.x unicode tkinter


    【解决方案1】:

    你可能不走运。这些 Unicode 代码点是 UTF-16 代理项。当我使用 tkinter 为您的字符串使用正确的 Unicode 代码点时,错误变为:

    _tkinter.TclError: character U+1d412 is above the range (U+0000-U+FFFF) allowed by Tcl
    

    我使用的字符串:

    s = '\U0001d412\U0001d413\U0001d400\U0001d402\U0001d40a\U0001d40e\U0001d415\U0001d404\U0001d411\U0001d405\U0001d40b\U0001d40e\U0001d416.\U0001d402\U0001d40e\U0001d40c'
    
    import unicodedata as ud
    for c in s:
        print(ud.name(c))
    

    输出:

    MATHEMATICAL BOLD CAPITAL S
    MATHEMATICAL BOLD CAPITAL T
    MATHEMATICAL BOLD CAPITAL A
    MATHEMATICAL BOLD CAPITAL C
    MATHEMATICAL BOLD CAPITAL K
    MATHEMATICAL BOLD CAPITAL O
    MATHEMATICAL BOLD CAPITAL V
    MATHEMATICAL BOLD CAPITAL E
    MATHEMATICAL BOLD CAPITAL R
    MATHEMATICAL BOLD CAPITAL F
    MATHEMATICAL BOLD CAPITAL L
    MATHEMATICAL BOLD CAPITAL O
    MATHEMATICAL BOLD CAPITAL W
    FULL STOP
    MATHEMATICAL BOLD CAPITAL C
    MATHEMATICAL BOLD CAPITAL O
    MATHEMATICAL BOLD CAPITAL M
    

    我使用了 Python 3.5 文档中的“hello world”示例:

    import tkinter as tk
    
    s = '\U0001d412\U0001d413\U0001d400\U0001d402\U0001d40a\U0001d40e\U0001d415\U0001d404\U0001d411\U0001d405\U0001d40b\U0001d40e\U0001d416.\U0001d402\U0001d40e\U0001d40c'
    
    class Application(tk.Frame):
        def __init__(self, master=None):
            tk.Frame.__init__(self, master)
            self.pack()
            self.createWidgets()
    
        def createWidgets(self):
            self.hi_there = tk.Button(self)
            self.hi_there["text"] = s
            self.hi_there["command"] = self.say_hi
            self.hi_there.pack(side="top")
    
            self.QUIT = tk.Button(self, text="QUIT", fg="red",
                                                command=root.destroy)
            self.QUIT.pack(side="bottom")
    
        def say_hi(self):
            print("hi there, everyone!")
    
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()
    

    【讨论】:

    • 简而言之:Tcl 似乎不支持 BMP 以外的字符。这意味着例如也没有表情符号。
    • 似乎 Tk 已经准备好在 Windows 上使用 UTF-16。它在内部使用 UTF-8,并将其转换为宽字符串并调用 TextOutW(在 AllocFontFamily 中设置并在 MultiFontTextOut 中调用)来绘制文本。在正式将TCL_UTF_MAX 增加到 4 之前,开发人员可能只是在解决一些问题。
    猜你喜欢
    • 2017-08-06
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2021-11-25
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多