Как записать данные в файл на хинди? - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь записать данные в файл нелатинским скриптом, используя python tkinter. Я хочу записать данные в файл на хинди, который следует за сценарием деванагари. В то время как, когда я пишу некоторые данные на английском языке, все работает отлично, тогда как запись в файл на хинди вызывает некоторые ошибки. Как мне решить эту проблему?

Я попытался добавить (encoding = 'utf-8') в команду filedialog. При этом выдается следующая ошибка:

_tkinter.TclError: неверный параметр "-encoding": должен быть -confirmoverwrite, -defaultextension, -filetypes, -initialdir, -initialfile, -parent, -title или -typevariable

Эта ошибка отображается в тот момент, когда я нажимаю кнопку. Maybe (encoding = 'utf-8') не является атрибутом filedialog. Ниже приведена соответствующая часть кода:

def save_file_hindi(event=""):
    data = filedialog.asksaveasfile(mode="w", defaultextension=".html")
    if data is None:
        return

    data.write("एक" + "<br>\n"+ "दो" + "<br>\n")
    data.close()

Ожидаемый результат: В сохраненном HTML-файле должно отображаться:

एक

दो

Фактический результат: UnicodeEncodeError: кодек 'charmap' не может кодировать символы в позиции 19-26: символы отображаются на неопределенные

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Согласно документации File Dialogs для asksaveasfilename опция кодирования недоступна.Но вы можете открыть файл в режиме записи, указать кодировку «utf-8» и записать в нее позже.

import tkinter as tk
from tkinter import filedialog

def Test():        
    root = tk.Tk()

    myFile = filedialog.asksaveasfilename(defaultextension='.html')

    if not myFile:
        return        

    with open(myFile, 'w', encoding='utf-8') as f:
        f.write("एक" + "<br>\n"+ "दो" + "<br>\n")   

    root.mainloop()


Test()
0 голосов
/ 02 апреля 2019

Я нашел очень реальное решение проблемы, с которой столкнулся ранее. Итак, я отвечаю на свой вопрос, так как он может оказаться полезным для любого, кто сталкивается с ошибкой, похожей на мою. Решение должно работать для записи в файл на любом языке, который написан не по-римски (хинди, урду, китайский, русский, арабский и т. Д.). Среда программирования, в которой я работаю - это python 3.6.

Единственные исправления к коду -

  1. Измените mode = 'w' на mode = 'wb', чтобы данные, которые должны быть записаны в файл, читались в байтах, поскольку для любой формы кодирования интерпретатор должен сканировать данные в байтах.
  2. В командной строке (.write) добавьте кодировку в виде .encode ('utf-8'). Как я уже упоминал в своей проблеме, encode = 'utf-8' не является атрибутом (filedialog.asksaveasfile). Тем не менее, это на самом деле «метод» и должен быть сформулирован только так. Итак, новый исправленный код -

     def save_file_hindi(event=""):
     data = filedialog.asksaveasfile(mode="wb", defaultextension=".html")
     if data is None:
         return
    
     data.write(("एक" + "<br>\n"+ "दो" + "<br>\n").encode('utf-8'))
     data.close()
    
0 голосов
/ 02 апреля 2019

Пробовал этот код, и он отлично работал с Python 3.6.5 под Windows 10:

text = """<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head><body>
<p>एक  दो</p>
</body></html>"""

with open('test.html', 'w', encoding='utf8') as file:
    file.write(text)

Какова ваша среда?Вы пытались открыть файл в разных редакторах и / или браузерах?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...