VS2019 visual studio 终端乱码04 - 乱码案例
该系列主要四个部分组成:
VS2019 visual studio 终端乱码01 - 相关基础概念
VS2019 visual studio 终端乱码02 - 查看修改终端编码
VS2019 visual studio 终端乱码03 - VS中查看修改文件编码
➡️ VS2019 visual studio 终端乱码04 - 乱码案例
本节目标
- 掌握Python 编解码背景知识
- 掌握 python 读写文件过程乱码解决方案
【Python 编解码背景知识】
python 源代码文件创建执行过程编解码流程[1]
- 创建 .py 源文件:在 visual studio 和 Pycharm 中编写,编辑器会指定文件编码,比如 UTF-8 ,则文本中 Unicode 字符串就会被编码(encode)成对应字节存放在磁盘中。保存好的文件,在不同的编辑器中打开,就要按对应的编码解码(decode),才能正常显示。
- 使用 Python解释器执行代码:Python解释器在读取Python代码文件中的字节串之后,需要将其转换为Unicode字符串(decode过程)之后才执行后续操作。
头部未添加 #-*- copding:utf-8 -*-
时,python 解释器选择哪种字符编码?
>>> # Python2
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> # Python3
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
常见解码失败情况
python2 中存在汉语,如果没有指定,则 python 使用默认字符编码"ASCII"进行解码,导致中文字符解码失败,出现如下错误:
SyntaxError:Non-ASCII character '\xc4' in file xxx.py on line 11, but no encoding declared;
see http://python.org/dev/peps/pep-0263/ for details
解决这个问题,需要在头部添加 #-*- copding:utf-8 -*-
在 Windows 上进行开发时,Python 工程及代码文件都使用的是默认的 GBK 编码,也就是说 Python 代码文件是被转换成GBK格式的字节码保存到磁盘中的。Python3 的解释器执行该代码文件时,试图用 UTF-8 进行解码操作时,同样会解码失败,出现如下错误:
SyntaxError:Non-UTF-8 code starting with '\xc4' in file xx.py on line 11, but no encodingdeclared;
see http://python.org/dev/peps/pep-0263/ for details
python 编码转化
详细字符可请参考 [2]
python 读写文件过程乱码(读写Txt)
【问题描述】
# 打开文件不添加编码,默认使用 GB2312
str = "中文Chinese123"
with open("testData\\test.txt",'w') as fw:
print("中文Chinese123")
fw.write(str)
运行后,查看终端输出(print 输出),IDE、Notepad++、Sublime中查看 test.txt
- cmd print 输出正常:cmd 代码页 936,GB2312 兼容中文,显示正常
- IDE 查看txt 正常显示:编码为 GB2312,显示正常
- 终端 cat 查看 正常显示:cat 查看默认编码为 GB2312,显示正常
- Sublime 查看 乱码显示:sublime默认打开utf-8,显示乱码 见解决方案1
- Notepad++ 查看 正常显示:Notepad++ 识别编码,打开正常
str = "中文Chinese123"
with open("testData\\test.txt",'w',encoding='utf-8') as fw:
print("中文Chinese123")
fw.write(str)
- cmd print 输出正常:cmd 代码页 936,GB2312兼容中文,显示正常(这里存疑,待解决)
- IDE 查看txt 显示乱码:编码为 UTF-8,显示乱码 见解决方案2
- 终端 cat 查看 显示乱码:cat 查看默认编码为 GB2312,显示乱码 见解决方案3
- Sublime 查看 正常显示:sublime默认打开utf-8,显示正常
- Notepad++ 查看 正常显示:Notepad++ 识别编码,显示正常
【解决方案1】:Sublime 打开乱码
- 确定文件编辑保存编码
- sublime 点击 file | Reopen with Encoding | 编码名称
【解决方案2】:VS IDE 打开文本文件乱码
- 保存文件按照 utf-8 输入,而 VS 默认打开按 "GB2312" 解码,因此乱码
- 工具 | 选项 | 文本编辑器 | 常规 | 勾选 自动检测不带签名的 UTF-8 编码。当检测非 UTF-8 编码,会转化为 UTF-8 显示
【解决方案3】:cat 打开文本文件乱码
添加解码类型,即可正确显示
cat .\train_data.txt -encoding UTF8
其他操作
结合网上分析,还有两种操作(未经本人测试,若读者有新的测试或者更好的补充可在评论区中添加):
第一种,修改终端属性,使用旧版控制台。这个作用可能是源文件编码使用旧版本 utf-8,修改成旧版,可以解决已有文件的显示问题,但不能新建文件的显示问题;
第二种,勾选区域语言-Beta版:使用Unicode UTF-8 提供全球语言支持,这个修改方案有报道会带来其他程序乱码问题。通过该方案奏效的情况可能是中文GBK编码情况下,提供 utf-8 编码支持。这里还提到修改字体对中文显示的影响。