正如您所指出的,您的代码在 Windows 上可以正常工作(在 Windows 10 上测试过),但是对于 macOS,以下解决方法应该可以解决问题:
- 将表情符号的编码从UTF-32转换为UTF-16(不会丢失任何功能,因为UTF-16是一种可变长度编码,因此可以将任何可以用UTF-32表示的代码点转换为UTF-16,只有在涉及现代表情符号的情况下,UTF-16编码值将使用32位,与UTF-32相同,这意味着它应该支持Unicode v11字符表示)。
- 将结果字符串传递给嵌入式的Tcl/Tk解释器。
在UTF-16中,范围为U+0000—U+D7FF和U+E000—U+FFFD的字符被存储为单个16位单位。非BMP字符(范围为U+10000—U+10FFFF)被存储为“代理对”,即两个16位单位:高代理项(范围为U+D800—U+DBFF),后跟低代理项(范围为U+DC00—U+DFFF)。
对于Tcl来说,要执行unicode转义字符串(带有其字符/表情符号表示)的替换,字符串本身必须采用形式"\uXXXX"或"\uXXXX\uXXXX"。
花栗鼠表情符号的编码必须转换为UTF-16 => "\ud83d\udc3f"。
set chipmunk "\ud83d\udc3f"
pack [set c [canvas .c -highlightcolor blue -highlightbackground black -background yellow]] -padx 4cm -pady 4cm -expand 1 -fill both
set text_id [$c create text 0 0 -text $chipmunk -font [list * 180]]
$c moveto $text_id 0 0
![Unicode chipmunk in Tcl/Tk](https://istack.dev59.com/5N1Ed.webp)
相当于Python中的代码,在某些时候需要绕过Tkinter并向嵌入/链接解释器发出直接的Tcl命令。
import tkinter as tk
top = tk.Tk()
c = tk.Canvas(top, highlightcolor = 'blue', highlightbackground = 'black', background = 'yellow')
text_id = c.create_text(0,0, font = '* 180', text = 'to be replaced')
c.pack(side = 'top', fill = 'both' , expand = 1, padx = '4c' , pady = '4c')
chipmunk = r"\ud83d\udc3f"
c.tk.eval('set the_tcl_chipmunk {}'.format(chipmunk))
c.tk.eval( '{} itemconfig {} -text [set the_tcl_chipmunk]'.format( str(c), text_id ) )
c.tk.eval( '{} moveto {} 0 0'.format( str(c), text_id ) )
top.mainloop()
![Unicode chipmunk in python](https://istack.dev59.com/KkNYW.webp)
获取花栗鼠的UTF-16
有两种途径可供选择:
从网站获取,我经常使用 fileformat.info 查看chipmunk在fileformat.info的页面 并复制显示的值C/C++/Java源代码
在Python中执行从UTF-32到UTF-16的转换
chipmunk_utf_32 = '\U0001F43F'
chipmunk_utf_16 = chipmunk_utf_32.encode('utf-16-be')
chipmunk_utf_16 = chipmunk_utf_16.hex()
chipmunk = '\\u{}\\u{}'.format(chipmunk_utf_16[0:4], chipmunk_utf_16[4:8])
编辑:整个脚本
import tkinter as tk
chipmunk_utf_32 = '\U0001F43F'
chipmunk_utf_16 = chipmunk_utf_32.encode('utf-16-be')
chipmunk_utf_16 = chipmunk_utf_16.hex()
chipmunk = '\\u{}\\u{}'.format(chipmunk_utf_16[0:4], chipmunk_utf_16[4:8])
top = tk.Tk()
c = tk.Canvas(top, highlightcolor = 'blue', highlightbackground = 'black', background = 'yellow')
text_id = c.create_text(0,0, font = '* 180', text = 'to be replaced')
c.pack(side = 'top', fill = 'both' , expand = 1, padx = '4c' , pady = '4c')
c.tk.eval('set the_tcl_chipmunk {}'.format(chipmunk))
c.tk.eval( '{} itemconfig {} -text [set the_tcl_chipmunk]'.format( str(c), text_id ) )
c.tk.eval( '{} moveto {} 0 0'.format( str(c), text_id ) )
top.mainloop()
\uD83D\uDC3F
吗? - Jerrytext =' \ U0001F43F'
),但对于多个32位代码点的更复杂的表情符号,这种漏洞不起作用。 - jdaz