我正在尝试使用python tkinter在非罗马脚本中将数据写入文件。我想将数据写入遵循梵文脚本的印地语语言文件中。虽然,当我用英语写一些数据时,它工作得很好,而用印地语写文件则抛出了一些错误。我该如何解决这个问题?
我尝试在filedialog命令中添加(encoding ='utf-8')。这样做会产生以下错误:
_tkinter.TclError:错误的选项“ -encoding”:必须为-confirmoverwrite,-defaultextension,-filetypes,-initialdir,-initialfile,-parent,-title或-typevariable
单击按钮时立即显示此错误。也许(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中的字符进行编码:字符映射为未定义
答案 0 :(得分:0)
尝试过此代码,在Windows 10下与Python 3.6.5配合使用时效果很好:
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)
您的环境如何?您是否尝试过在不同的编辑器和/或浏览器中打开文件?
答案 1 :(得分:0)
根据File Dialogs documentation for 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()
答案 2 :(得分:0)
我找到了一个非常可行的解决方案,可以解决我先前遇到的问题。因此,我正在回答我自己的问题,因为对于遇到类似于我的错误的任何人来说,它可能会派上用场。该解决方案应能以非罗马文字(印地语,乌尔都语,中文,俄语,阿拉伯语等)的任何语言写入文件。我正在使用的编程环境是python 3.6。
该代码的唯一更正是-
在(.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()