求解答:
写python程序时,写中文注释时,遇到了Non-utf-8的报错
那么解决方法是在开头加上coding:utf-8的声明
可中文明明在utf-8中有相应的映射啊,而且python3的默认编码还是utf-8
而且明明不是utf-8的字符却要utf-8编码,这不矛盾吗?
难道报错的消息指的是在.py文件储存时的编码有问题吗?
当你在Python程序中写中文注释时遇到"Non-UTF-8"的报错时,这通常意味着Python解释器无法识别源代码文件中的编码格式。
在Python 3中,默认编码确实是UTF-8,因此你可以在源代码文件中使用UTF-8编码的中文字符而无需声明。然而,如果你在源代码文件中使用了其他编码格式,或者在保存源代码文件时使用了非UTF-8编码格式,就可能会出现"Non-UTF-8"的报错。
为了解决这个问题,你可以尝试以下方法:
确保源代码文件以UTF-8编码保存:
在文本编辑器中打开源代码文件,检查文件的编码格式。大多数文本编辑器都提供了选择文件编码格式的选项。
确保将源代码文件保存为UTF-8编码格式。
在源代码文件开头添加编码声明:
在源代码文件的开头添加# coding: utf-8的声明,指示解释器使用UTF-8编码解析源代码文件。
7.1 python2和python3中查看默认编码
在python2中,解析含有中文的“utf-8”编码的文件时,通常会在脚本前加上
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
用来设置默认编码方式,但Python3中删除了这种方式。
笔者通过查看python中的默认编码方式,发现脚本中,已经默认是“utf-8”的编码了
查看python的字符串默认编码
import sys
sys.getdefaultencoding()
输出'utf-8'
python3下
python3.x下应该改为如下方式:
import importlib
importlib.reload(sys)
7.2解析"\u"开头的字符串
"\u6e58"就是unicode编码
plate = "\u6e58AV256G"
print(plate)
plate = "湘AV256G"
print(plate)
plate = u"湘AV256G"
print(plate)
plate = u"\u6e58AV256G"
print(plate)
打印出来,都是湘AV256G
,可见以上并没有区别
7.3 Unicode的bytes数据,解码成Unicode
字符串前有个b,表示这个是Bytes型数据
plate = b'\u6e58AV256G'
print(plate)
print(plate.decode("unicode-escape"))
输出
b'\\u6e58AV256G'
湘AV256G
7.3如下utf-8的bytes数据,解码成utf-8
以\x开头
plate = b'\xe6\xb9\x98AV256G'
print(plate)
print(plate.decode("utf-8"))
输出
b'\xe6\xb9\x98AV256G'
湘AV256G
7.4 字符串编码成Unicode
plate = r'湘AV256G'
print(plate)
print(plate.encode('unicode-escape'))
输出
湘AV256G
b'\\u6e58AV256G'
7.5 字符串编码成 utf-8
plate = r'湘AV256G'
print(plate.encode('utf-8'))
输出
b'\xe6\xb9\x98AV256G'
PS:湘AV256G为笔者自编的车牌号,如有雷同,纯属巧合。
在 Python 文件头部加上以下代码即可解决写中文注释遇到的 Non-utf-8 报错问题:
# coding=utf-8
# -*- coding: UTF-8 -*-
其中第一行的 # coding=utf-8
声明了文件的编码方式为 UTF-8,第二行的 # -*- coding: UTF-8 -*-
也是一种常见的声明方法。使用其中任意一行即可。
这里需要注意的是,声明文件编码方式为 UTF-8 是必需的,因为 Python 默认采用 ASCII 编码,而中文不在 ASCII 码表中,因此在不声明编码方式的情况下会出现编码错误。
至于中文在 UTF-8 编码中已有对应的映射表,这并不影响在 Python 文件中使用中文注释需要进行 UTF-8 编码的事实。同时也不是在 .py 文件存储时的编码有问题,而是必需在代码中明确声明其编码方式。