Python 2.7:UnicodeDecode错误,当我使用字符点和导入套接字连接时



我在Windows下使用python。当我执行这个简单的代码时,我有这个错误"UnicodeDecodeError:'utf8'编解码器无法解码字节0x92":

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((controlAddr, 9051))

controlAddr 是"127.0.0.1",我知道是字符"."导致了问题,所以我尝试了不同的转换,但每次都有相同的错误。我尝试了这些不同的方法:

  • controlAddr = u'127.0.0.1'
  • controlAddr = unicode('127.0.0.1')
  • controlAddr.encode('utf-8')
  • controlAddr = u'127'+unichr(ord('x2e'))+u'0'+unichr(ord('x2e'))+'0'+unichr(ord('x2e'))+u'1'

我在主文件和 socket.py 文件的开头添加了# -*- coding: utf-8 -*-。...我仍然有同样的错误

您的错误说'utf8'编解码器无法解码字节0x92"。在 Windows 代码页 1252 中,此字符映射到 U+2019 右引号

用于 Python 脚本的编辑器可能配置为将单引号('\x27' 或 ' )替换为右引号。对于文本来说可能更好,但在源代码中却很糟糕。您必须在编辑器中修复它,或使用其他编辑器。

错误消息说您的文件中某处有一个字节0x92,这在 utf-8 中无效,但在其他编码中可能是,例如:

>>> b'x92'.decode('windows-1252')
'`'

这意味着您的文件编码不是 utf-8,而可能是 windows-1252,有问题的字符是反引号,而不是点,即使该字符仅在注释中找到。

因此,要么在编辑器中将文件编码更改为 utf-8,要么将编码行更改为

# -*- coding: windows-1252 -*-

错误消息没有提到解释器窒息的文件,但它可能是您的"主"文件,而不是socket.py

另外,不要将您的文件命名为 socket.py ,这将隐藏内置套接字模块并导致进一步的错误。

设置

编码行仅影响该一个文件,您需要为每个文件执行此操作,仅在"主"文件中设置它是不够的。

谢谢 !事实上,这个字符在 utf-8 中不存在。但是,我没有发送字符"'",对应于 windows-1252 中的0x92,而 utf-8 中没有任何内容。此外,当字符"."在controlAddr中并且两种编码(即0x2e)的十六进制代码相同时,会出现此错误。完整的错误消息如上所示: Traceback (most recent call last): File "C:Python27Libsite-packagesspyderlibwidgetsexternalshellpythonshell.py", line 566, in write_error self.shell.write_error(self.get_stderr()) File "C:Python27Libsite-packagesspyderlibwidgetsexternalshellbaseshell.py", line 272, in get_stderr return self.transcode(qba) File "C:Python27Libsite-packagesspyderlibwidgetsexternalshellbaseshell.py", line 258, in transcode return to_text_string(qba.data(), 'utf8') File "C:Python27Libsite-packagesspyderlibpy3compat.py", line 134, in to_text_string return unicode(obj, encoding) File "C:Python27Libencodingsutf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 736: invalid start byte 对于此代码: controlPort = 9051 controlAddr = unicode("127.0.0.1") import socket s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((controlAddr, controlPort))

最新更新