Как правильно отображать нелатинские символы на выводимой текстовой консоли?

#python #python-3.x #tkinter #unicode #utf-8

Вопрос:

Я новичок в Python. Я экспериментирую, чтобы сделать «IDE» для запуска скрипта Python, отображающего нелатинские символы, особенно индонезийские локальные скрипты (яванский, балийский, бугинский и т.д.), Которые были включены в стандарт Unicode. Пожалуйста, подумайте об установке индонезийских шрифтов Юникода, чтобы правильно отображать символы.

Вот код:

 from tkinter import *

from tkinter.filedialog import asksaveasfilename, askopenfilename
import subprocess

compiler = Tk()
compiler.title ('ᮊᮧᮙ᮪ᮕᮤᮜᮨᮁ ᮞᮥᮔ᮪ᮓ')
file_path = ''

def set_file_path(path):
    global file_path
    file_path = path

def save_as():
    if file_path == '':
        path = asksaveasfilename(filetypes=[('Python Files', '*.py')])
    else:
        path = file_path
    with open(path, 'w') as file:
        code = editor.get('1.0', END)
        file.write(code)
        set_file_path(path)

def open_file():
    path = askopenfilename(filetypes=[('Python Files', '*.py')])
    with open(path, 'r') as file:
        code =file.read()
        editor.delete('1.0', END)
        editor.insert('1.0', code)
        set_file_path(path)

def run():
    if file_path == '':
        save_prompt = Toplevel()
        text = Label(save_prompt, text='ᮞᮤᮙ᮪ᮕᮨᮔ᮪ ᮠᮩᮜ ᮊᮧᮓᮩ ᮃᮔ᮪ᮏᮩᮔ᮪')
        text.pack()
        return
    command = f'python {file_path}'
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    output, error = process.communicate()
    code_output.insert('1.0', output)
    code_output.insert('1.0', error)


menu_bar = Menu(compiler)

file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label='ᮘᮥᮊ', command=open_file)
file_menu.add_command(label='ᮞᮤᮙ᮪ᮕᮨᮔ᮪', command=save_as)
file_menu.add_command(label='ᮞᮤᮙ᮪ᮕᮨᮔ᮪ ᮔᮥ ᮞᮦᮏᮦᮔ᮪', command=save_as)
file_menu.add_command(label='ᮊᮜᮥᮃᮁ', command=exit)
menu_bar.add_cascade(label='ᮘᮨᮁᮊᮞ᮪', menu=file_menu)

run_bar = Menu(menu_bar, tearoff=0)
run_bar.add_command(label='ᮏᮜᮔ᮪ᮊᮩᮔ᮪', command=run)
menu_bar.add_cascade(label='ᮏᮜᮔ᮪ᮊᮩᮔ᮪', menu=run_bar)

compiler.config(menu=menu_bar)

editor = Text()
editor.pack()

code_output = Text(height=10)
code_output.pack()

compiler.mainloop()
 

Я хочу напечатать нелатинские символы, например:

 print('Sundanese script')
print('ᮃᮊ᮪ᮞᮛ ᮞᮥᮔ᮪ᮓ')
 

к сожалению, результат показывает это:

 Sundanese script
ᮃᮊ᮪ᮞᮛ ᮞᮥᮔ᮪ᮓ
 

или такой код, как этот:

 import unicodedata

u = chr(233)   chr(0x03B2)   chr(0xA991)   chr(0x1B11)   chr(0x1B91)   chr(0x1BE1)

for i, c in enumerate(u):
    print(i, 'x' % ord(c), unicodedata.category(c), u[i], end=" ")
    print(unicodedata.name(c))
 

отобразит это:

 0 00e9 Ll é LATIN SMALL LETTER E WITH ACUTE
1 03b2 Ll β GREEK SMALL LETTER BETA
2 a991 Lo ꦑ JAVANESE LETTER KA MURDA
3 1b11 Lo ᬑ BALINESE LETTER OKARA
4 1b91 Lo ᮑ SUNDANESE LETTER NYA
5 1be1 Lo ᯡ BATAK LETTER CA
 

Но import unicodedata сценарий может хорошо отображаться на терминале:

 >>> import unicodedata
>>> 
>>> u = chr(233)   chr(0x03B2)   chr(0xA991)   chr(0x1B11)   chr(0x1B91)   chr(0x1BE1)
>>> 
>>> for i, c in enumerate(u):
...     print(i, 'x' % ord(c), unicodedata.category(c), u[i], end=" ")
...     print(unicodedata.name(c))
... 
0 00e9 Ll é LATIN SMALL LETTER E WITH ACUTE
1 03b2 Ll β GREEK SMALL LETTER BETA
2 a991 Lo ꦑ JAVANESE LETTER KA MURDA
3 1b11 Lo ᬑ BALINESE LETTER OKARA
4 1b91 Lo ᮑ SUNDANESE LETTER NYA
5 1be1 Lo ᯡ BATAK LETTER CA
 

Может ли кто-нибудь указать на проблему?

Комментарии:

1. Если я не ошибаюсь, терминалы немного сложны в этой части. Расскажите нам больше об операционной системе и оболочке, которые вы используете

2. Простой случай с моджибаке. print('ᮃᮊ᮪ᮞᮛ ᮞᮥᮔ᮪ᮓ'.encode('utf8').decode('cp1252')) возвращает ᮃᮊ᮪ᮞᮛ ᮞᮥᮔ᮪ᮓ Попытку code_output.insert('1.0', output.decode()) внутри run() процедуры. Как ни странно, это работает для меня, хотя я плохо понимаю 'tkinter.Text класс…

3. Python выводит только байты, а не кодовые точки Юникода. Ваш терминал должен быть правильно настроен для декодирования этих байтов и отображения соответствующих символов.