python - 使用 socket.gethostname() 结果时出现 UnicodeDecodeError

标签 python unicode

我的一些用户报告,当主机名包含非 ASCII 字符时,以下代码可能会引发 UnicodeDecodeError(但是我无法在 Windows Vista 计算机上复制此错误):

    self.path = path
    self.lock_file = os.path.abspath(path) + ".lock"
    self.hostname = socket.gethostname()
    self.pid = os.getpid()
    dirname = os.path.dirname(self.lock_file)
    self.unique_name = os.path.join(dirname, "%s.%s" % (self.hostname, self.pid))

回溯的最后一部分是:

    File "taskcoachlib\thirdparty\lockfile\lockfile.pyo", line 537, in FileLock
    File "taskcoachlib\thirdparty\lockfile\lockfile.pyo", line 296, in __init__
    File "taskcoachlib\thirdparty\lockfile\lockfile.pyo", line 175, in __init__
    File "ntpath.pyo", line 102, in join
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 7: ordinal not in range(128)

关于为什么以及如何预防它有什么想法吗?

(Windows XP 上的 Python 2.5 出现异常)

最佳答案

我不认为 gethostname() 一定会给你一个 unicode 对象。它可能是锁定文件的目录名称。无论如何,其中一个是包含非 ASCII(高于 127)字符的标准字符串,另一个是 unicode 字符串。

问题在于 ntpath 模块(Python 在 Windows 上用于 os.path 的模块)中的 join 函数尝试连接给定的参数。这会导致 Python 尝试将普通字符串部分转换为 unicode。在您的情况下,非 unicode 字符串似乎具有非 ASCII 字符。这无法可靠地转换为 unicode,因此 Python 会引发异常。

触发问题的更简单方法:

>> from ntpath import join
>> join(u'abc', '\xff')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)

/home/msmits/<ipython console> in <module>()

/usr/lib64/python2.6/ntpath.pyc in join(a, *p)
    106                     path += b
    107                 else:
--> 108                     path += "\\" + b
    109             else:
    110                 # path is not empty and does not end with a backslash,

回溯显示 ntpath.py 中的问题行。

您可以通过首先将 join() 的参数转换为标准字符串来解决此问题,正如其他答案所建议的那样。或者,您可以先将所有内容转换为 unicode。如果给decode()指定一个特定的编码,高字节可以转换为unicode。

例如:

>> '\xff'.decode('latin-1')
u'\xff'

关于python - 使用 socket.gethostname() 结果时出现 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1290601/

相关文章:

python - 在 TensorFlow 中,如何沿着参差不齐的维度索引参差不齐的张量?

Python 通过不同路径导入相同对象 - 类属性和基元之间的不同行为

python - 如何允许打开文件名中包含 Unicode 字符的文件?

python - Django:icontains 大小写对 unicode 敏感

c++ - 关于 WinAPI unicode 的教程?

python - 连接终止了 Azure 容器

python - GAE 数据存储 : query a existing by user_id field

python - 如何检查 python 中列表的所有项目都等于 a?

Python .lower 似乎没有正确地小写所有 unicode 字符(Python 2.7)

string - 如何转义多字节字符 utf8