在《信创之国产浪潮电脑+统信UOS操作系统体验4:visual studio code中怎么显示中文》介绍了在vscode编辑器中怎么正常显示中文,最近老猿在vscode中编辑Python文件,在编辑器中正常显示中文,但执行时报错的问题,可见字符集确实是国产化操作系统、linux系统+vscode编辑并执行含中文字符处理的一个关键问题,下面来整体介绍一下相关情况。
文件内容如下:
print("hello,world!")
print("你好!")
python ./hello.py
python ./hello.py
,报错如下:SyntaxError: Non-UTF-8 code starting with '\xc4' in file ./hello.py on line 3,
but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
截图如下:
3. 调整代码中的字符集声明为utf-8
在代码第一行增加# -*- coding: utf-8 -*-
,再在终端中执行,报错信息变为:
SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
将代码第一行字符集改为GBK,全代码如下:
# -*- coding: GBK -*-
print("hello,world!")
print("你好!")
执行正常执行,如此可以确认是代码文件的字符集与文件中声明的字符集不匹配导致。从vscode的状态栏右下角可以看到字符集为GBK,如上图绿色箭头所示,也就是代码文件是GBK字符集的,那么在带中的声明必须与此匹配。
上面出现问题到解决,是在python文件中声明字符集类型来解决的,但有时由于项目要求必须以特定字符集如UTF-8来执行,上述解决办法行不通,最好的办法就是项目要求的字符集和文件的字符集在开始时就保持一致,这要区分新建文件和存量文件来进行不同的处理。
在vscode中,可以通过《信创之国产浪潮电脑+统信UOS操作系统体验4:visual studio code中怎么显示中文》介绍的首选项设置字符集方法,将新建文档的字符集指定为特定字符集,下图是设置为GBK字符集:
可以将其设置改为UTF-8:
如果不是vscode的编辑器,则保存文件的字符集需要不同的方式来设置,下图是统信操作下图自带文本编辑器的设置方法(文件保存时设置字符集):
如果已有一个存量文件的字符集如GBK,要变更成另一个字符集,则需要另外的方法。
可以通过vscode打开文件查看字符集,也可以通过linux的file -i
指令查看文件的字符集信息,例如:
可以看到hello.py字符集是iso-8859-1,但是在vscode内打开变成了GBK字符集,应该是vscode自动做了转换,具体机制老猿还没研究清楚。
转换字符集有个方法:
iconv -f 源文件字符集 -t 目标文件字符集 源文件名 > 目标文件名
,但这个方法使用上需要注意源文件字符集的取值,具体看下面的案例。用上面介绍的hello.py这个文本文件,可以看到在vscode中显示字符集为GBK,在file -i指令中显示为iso-8859-1,那么转换用哪个字符集呢?我们实际验证一下:
iconv -f iso-8859-1 -t UTF-8 hello.py >h.py
,转换后打开文件,相关截图如下:iconv -f GBK -t UTF-8 hello.py >h.py
,转换后打开文件,相关截图如下:本文介绍了一个在统信linux操作系统UOS下执行Python文件输出中文报错的案例,从查看文件字符集编码、新建文件设定字符集、python文件声明字符集以及存量文件调整文件字符集编码的角度比较全面的介绍了问题产生的原因、解决办法,代码文件的字符集与文件中声明的字符集不匹配是导致这个问题的根源,解决办法就是通过调整文件字符集、py文件声明文件字符集保持一致。
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
更多关于信创之国产浪潮电脑+统信UOS操作系统体验的内容请参考专栏《国产信创之光》的其他文章。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。