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)到文本文件,为什么还是会出现乱码?
你遇到的是编码问题。核心原因在于:文件写入时使用了正确的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)
关键点:
- 写入和读取必须配对:
encoding='utf-8'要同时用在写和读的操作中。 - 检查文本编辑器:如果用第三方软件查看文件,确保该软件也设置为UTF-8编码查看(如VS Code右下角选择UTF-8,Notepad++选择“编码”->“使用UTF-8编码”)。
- 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
乱码贴出来看看
我猜 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 编码


