【问题标题】:Character Encoding problem when saving to a file from a TEXT BOX content从文本框内容保存到文件时出现字符编码问题
【发布时间】:2021-10-26 21:39:01
【问题描述】:

问题在于字符 Ğ、ğ、Ş、ş

这是我的代码:

# save file
def save_file():
    file = filedialog.asksaveasfile(defaultextension='.txt', filetypes=[("Text File","*.txt"),
                                        ("HTML File", "*.html"), ("DOC File", "*.doc"),
                                        ("All Files", "*.*")])
    if file is None:
        return
    file_text = text_box.get('1.0', END)

    with open("file_text.txt", mode='w', encoding='utf-8') as outFile:
        outFile.write(file_text)
    file.write(file_text)
    file.close()
# end save as file

这是错误信息:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files\Python39\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "C:\Users\mmara\PycharmProjects\pythonProject1\risk2.py", line 163, in save_file
    file.write(file_text)
  File "C:\Program Files\Python39\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 8-9: character maps to <undefined>

进程以退出代码 0 结束

当我执行代码并使用“另存为”按钮时,如果 text_box 中的文本包含例如 Ş 或 ş 字符,我会收到上述错误消息...。文件未保存...。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花2分钟tour。此外,打开Help center 并至少阅读How to Ask。然后,edit您的问题提供minimal reproducible example。 (特别是 which 的问题在于字符 Ğ、ğ、Ş、ş?也许您会看到 Äž、ÄŸ、Åž、ÅŸ?)
  • @JosefZ 我的猜测是字符没有正确保存
  • tkinter 没有“文本框”。如果您使用正确的术语,它会有所帮助。
  • 你怎么知道它没有保存数据?你说有问题,但你没有说明问题是什么。
  • @PetrL。 ... 字符没有正确保存... 问题是字符... 的模糊描述相同。 minimal reproducible example 是相关的(任何猜测都不是)。

标签: python tkinter unicode encoding character


【解决方案1】:

filedialog.asksaveasfile 返回的file 是一个打开的文件句柄。它似乎以cp1252 的默认编码打开。而是使用asksaveasfilename 来获取文件名,并使用encoding='utf8' 自己获取文件名open,类似于打开outFile 的方式。

测试示例:

from tkinter.filedialog import asksaveasfilename

file_name = asksaveasfilename()

if file_name:
    with open(file_name, 'w', encoding='utf8') as f:
        f.write('Ğ, ğ, Ş, ş')

【讨论】:

  • 您能否扩展执行此操作所需的代码行。尝试了几件事,但他们没有工作......
  • @MMA 添加了一个例子
  • 感谢您的回复。我上面给出的另存为代码部分在一个长代码中。上面的 SAVE AS 代码由 SAVE AS 按钮执行。 SAVE AS 按钮操作首先读取 text_box 内容,其中包含应用程序的单个用户键入的文本。因此它可能包含 Ş、ş、Ğ、ğ 字符(所有其他字母字符都可以正常工作,包括 Ö、ö、Ç、ç 和其他常见字母等)。读取的 text_box 的内容作为 *.txt、*.doc 等文件保存在计算机上的任何驱动器上。因此,“file.write(file_text)”这一行是必要的。
  • @MMA 你已经有了那个代码。整合我的样本。阅读文本框并致电f.write(file_text)。我只是在演示,如果您自己打开文件,您写入文件的任何内容都将起作用。
  • 有一些进展:修改后的代码代码现在执行没有错误,文件被保存。但是当我在写字板中打开 *.txt 文件时,我得到 Ş 作为 Åž,或者当我将文件保存为 *.doc 文件时,当我用 WORD 打开文件时,我再次得到 Ş 作为 Åž。有趣的是,文件显示端的文件浏览器将 Ş 显示为 Ş。
猜你喜欢
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多