我在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))