Python3 写入中文(utf-8)到文本文件,为什么还是会出现乱码?

MySQL 数据库里存的数据是 utf-8,python3 写入文本,还是会出乱码:

news = News.query.filter_by(news_id=news_id).first()
f = open('news.txt', 'w')
f.write(news.content)
f.close()

news.content 文章内容是全英文的 OK,文章里面有中文就是乱码。


Python3 写入中文(utf-8)到文本文件,为什么还是会出现乱码?

17 回复

你遇到的是编码问题。核心原因在于:文件写入时使用了正确的UTF-8编码,但读取或显示时没有用对应的UTF-8解码方式。

最常见的情况是,你用open('file.txt', 'w', encoding='utf-8')写入了文件,但用其他软件(如Windows记事本)打开时,它默认用GBK或ANSI编码去解码UTF-8文件,导致乱码。或者,你在Python里读取时没指定encoding='utf-8'

看个完整例子。假设我们要写入和读取包含中文的文本:

# 写入文件 - 明确指定utf-8编码
text = "你好,世界!这是UTF-8编码的中文。"
with open('example.txt', 'w', encoding='utf-8') as f:
    f.write(text)
print("文件写入完成。")

# 读取文件 - 同样明确指定utf-8编码
with open('example.txt', 'r', encoding='utf-8') as f:
    content = f.read()
print("读取的内容:", content)

关键点:

  1. 写入和读取必须配对encoding='utf-8'要同时用在写和读的操作中。
  2. 检查文本编辑器:如果用第三方软件查看文件,确保该软件也设置为UTF-8编码查看(如VS Code右下角选择UTF-8,Notepad++选择“编码”->“使用UTF-8编码”)。
  3. Windows记事本问题:Windows记事本默认用系统区域编码(如GBK)。要让它正确显示UTF-8,可以在文件开头加入BOM(字节顺序标记),但通常不推荐,因为BOM会影响其他程序处理。更好的方法是换用能识别UTF-8的编辑器。

如果问题是在网页或终端显示乱码,那可能是终端或网页的编码设置问题,不是文件本身的问题。

总结:确保读写编码一致,并用正确编码的软件查看。

试过加 encoding=‘utf-8’:

f = open(‘news.txt’, ‘w’, encoding=‘utf-8’)

中文还是乱码。

数据库编码设置,驱动编码设置

先搞清楚 news.content 是 bytes 还是 str

print(type(news.content)) 是 str 啊

news.content <class ‘str’>

news.content 需要编码转换
或者用 beautifulsoup 的 prettify()
https://gist.github.com/ercJuL/97e27d199451d43f93f14d41625955c9

乱码贴出来看看



<p>中文字符</p>

中文字符

我猜 new.content 里面是原内容以 utf-8 编码之后又原封不动转换成了对应的 str。所以解决方法是先原封不动转换成 bytes, 再按 utf-8 解码,即:news.content.encode(‘latin-1’).decode(‘utf-8’)

说到底还是数据库驱动设置的问题。

如上,写入的时候把 f.write( news.content ) 换成 f.write( news.content.encode(‘latin-1’).decode(‘utf-8’) ) 八成就行了。

f = open(‘news.txt’, ‘w’, encoding=‘utf-8’) 这样子不行?你打印的时候是不是乱码




呃,貌似不是数据库里编码的问题,有点奇怪,IDE 环境里 f.write(‘中文字符’) 写中文都是乱码。直接 IDLE 写 f.write(‘中文字符’) 没问题。把 IDE 里的 *.py 文件全部重新 encode 一下,现在好了

赌五毛楼主是 windows 环境,赌一块楼主不知道什么是 BOM

你先把 5 毛掏出来先,哈哈😄 全部是 ubuntu 环境 server 和 desktop (只是用了一次 idle ) bom 在这个 debug 里为什么要出现?

.py 文件也要保存成 UTF-8,新手问题

先确认你数据库内数据表的编码是 utf8,数据库连接是 utf8,数据存取时是 utf8,原始数据是 utf8 编码

回到顶部