Non-utf-8问题

求解答:
写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编码解析源代码文件。
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7492108
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:Python中对两种utf-8格式的理解
  • 除此之外, 这篇博客: python解析字符编码中的Unicode和UTF-8中的 七 、Python中对各种编码的处理 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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为笔者自编的车牌号,如有雷同,纯属巧合。

  • 以下回答由chatgpt基于相关博客总结生成:

    在 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 文件存储时的编码有问题,而是必需在代码中明确声明其编码方式。