你可能會走運。這些Unicode碼點是UTF-16替代品。當我用正確的Unicode編碼點的字符串tkinter
,錯誤變成了:
_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文檔的示例:
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以外的字符。這意味着例如沒有表情符號。 – 9000
似乎Tk在Windows上使用UTF-16。它在內部使用UTF-8,並繪製文本將其轉換爲寬字符字符串並調用['TextOutW'](https://msdn.microsoft.com/en-us/library/dd145133)(在[ AllocFontFamily'](http://core.tcl.tk/tk/artifact/b8b14e85a2fe1c8901422b0d99cf64d2e94c92eb?txt=1&ln=1544)並在['MultiFontTextOut']中調用(http://core.tcl.tk/tk/artifact/4830b197f8dd221678e14ecf4a87e80a1f1594be ?TXT = 1&LN = 1415))。也許開發人員只是在將TCL_UTF_MAX正式遞增到4之前就解決了一些問題。 – eryksun