You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter文本框含Ğ、ğ、Ş、ş等字符写入文件时出现字符编码错误问题

问题原因

报错核心是filedialog.asksaveasfile()方法在Windows系统下默认使用系统默认编码(此处为cp1252西欧编码)打开文件,而Ğ、ğ、Ş、ş这类字符不在cp1252的编码映射表中,因此写入时触发UnicodeEncodeError。你代码里单独用open()写固定文件file_text.txt时指定了encoding='utf-8'所以这步不会报错,报错是在写入asksaveasfile()返回的文件对象时触发的。

解决方法

方案1(全Python3版本兼容,推荐)

改用asksaveasfilename()获取用户选择的文件路径,手动调用open()时指定utf-8编码,适配性更强:

# 修正后的save_file代码
from tkinter import filedialog
from tkinter import END

def save_file():
    # 先获取用户选择的保存路径,不直接打开文件
    file_path = filedialog.asksaveasfilename(
        defaultextension='.txt', 
        filetypes=[
            ("Text File","*.txt"),
            ("HTML File", "*.html"), 
            ("DOC File", "*.doc"),
            ("All Files", "*.*")
        ]
    )
    # 用户点取消就直接返回
    if not file_path:
        return
    file_text = text_box.get('1.0', END)

    # 如果你不需要额外生成固定名的file_text.txt,可以删掉下面这段with open逻辑
    with open("file_text.txt", mode='w', encoding='utf-8') as outFile:
        outFile.write(file_text)
    
    # 手动打开用户选择的路径,指定utf-8编码写入
    with open(file_path, mode='w', encoding='utf-8') as user_file:
        user_file.write(file_text)
# end save as file

方案2(仅Python3.10及以上版本可用)

直接给asksaveasfile添加encoding参数,不用调整整体逻辑:

def save_file():
    # 直接指定encoding=utf-8打开文件
    file = filedialog.asksaveasfile(
        defaultextension='.txt', 
        filetypes=[("Text File","*.txt"),("HTML File", "*.html"), ("DOC File", "*.doc"),("All Files", "*.*")],
        encoding='utf-8'
    )
    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()

补充说明

你当前的代码会同时生成两个文件:一个是固定名称的file_text.txt,另一个是用户选择路径的自定义名称文件,如果不需要固定名的重复文件,可以删除对应with open("file_text.txt"...的逻辑。

内容的提问来源于stack exchange,提问作者MMA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:30:03