VS2019 visual studio 终端乱码04 - 乱码案例

该系列主要四个部分组成:


VS2019 visual studio 终端乱码01 - 相关基础概念


VS2019 visual studio 终端乱码02 - 查看修改终端编码


VS2019 visual studio 终端乱码03 - VS中查看修改文件编码


➡️ VS2019 visual studio 终端乱码04 - 乱码案例


本节目标

  1. 掌握Python 编解码背景知识
  2. 掌握 python 读写文件过程乱码解决方案

【Python 编解码背景知识】

python 源代码文件创建执行过程编解码流程[1]

  1. 创建 .py 源文件:在 visual studio 和 Pycharm 中编写,编辑器会指定文件编码,比如 UTF-8 ,则文本中 Unicode 字符串就会被编码(encode)成对应字节存放在磁盘中。保存好的文件,在不同的编辑器中打开,就要按对应的编码解码(decode),才能正常显示。
  2. 使用 Python解释器执行代码:Python解释器在读取Python代码文件中的字节串之后,需要将其转换为Unicode字符串(decode过程)之后才执行后续操作。
 python 源代码文件创建执行过程编解码流程
图1 python 源代码文件创建执行过程编解码流程
因此,在编辑器中设定的字符编码是解存和显示 .py 文件使用,若要正确显示字符,需要按照对应的编码进行解码;而 python 文件头部添加的 ``#-*- copding:utf-8 -*-``,是为 pyton 解释器解码使用,因此需和保存时确定的编码一致。

头部未添加 #-*- 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

 运行结果1
图2 运行结果1
  • 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)
 运行结果2
图3 运行结果2
  • cmd print 输出正常:cmd 代码页 936,GB2312兼容中文,显示正常(这里存疑,待解决)
  • IDE 查看txt 显示乱码:编码为 UTF-8,显示乱码 见解决方案2
  • 终端 cat 查看 显示乱码:cat 查看默认编码为 GB2312,显示乱码 见解决方案3
  • Sublime 查看 正常显示:sublime默认打开utf-8,显示正常
  • Notepad++ 查看 正常显示:Notepad++ 识别编码,显示正常

【解决方案1】:Sublime 打开乱码

  1. 确定文件编辑保存编码
  2. sublime 点击 file | Reopen with Encoding | 编码名称

【解决方案2】:VS IDE 打开文本文件乱码

  1. 保存文件按照 utf-8 输入,而 VS 默认打开按 "GB2312" 解码,因此乱码
  2. 工具 | 选项 | 文本编辑器 | 常规 | 勾选 自动检测不带签名的 UTF-8 编码。当检测非 UTF-8 编码,会转化为 UTF-8 显示
 自动检测不带签名的 UTF-8 编码
图4 自动检测不带签名的 UTF-8 编码

【解决方案3】:cat 打开文本文件乱码

添加解码类型,即可正确显示
cat .\train_data.txt -encoding UTF8

其他操作

结合网上分析,还有两种操作(未经本人测试,若读者有新的测试或者更好的补充可在评论区中添加):
第一种,修改终端属性,使用旧版控制台。这个作用可能是源文件编码使用旧版本 utf-8,修改成旧版,可以解决已有文件的显示问题,但不能新建文件的显示问题;
第二种,勾选区域语言-Beta版:使用Unicode UTF-8 提供全球语言支持,这个修改方案有报道会带来其他程序乱码问题。通过该方案奏效的情况可能是中文GBK编码情况下,提供 utf-8 编码支持。这里还提到修改字体对中文显示的影响。

 Beta版:使用Unicode UTF-8 提供全球语言支持
图5 Beta版:使用Unicode UTF-8 提供全球语言支持
第一种和第二种方法,经我分析只是解决了部分已有文件的编码冲突,可能会引入其他问题。本质上解决乱码问题,还是要核对整个流程上使用的解码方式,保证一致性,即可解决问题。
  1. Python2与Python3的字符编码与解码 ↩︎

  2. https://zhuanlan.zhihu.com/p/411551654 ↩︎

posted @ 2022-04-23 15:48  Oddpage  阅读(964)  评论(0编辑  收藏  举报