gpt4 book ai didi

python - 异常消息的默认编码

转载 作者:太空狗 更新时间:2023-10-29 22:08:38 25 4
gpt4 key购买 nike

以下代码检查了 float() 方法在输入非 ascii 符号时的行为:

import sys

try:
float(u'\xbd')
except ValueError as e:
print sys.getdefaultencoding() # in my system, this is 'ascii'
print e[0].decode('latin-1') # u'invalid literal for float(): ' followed by the 1/2 (one half) character
print unicode(e[0]) # raises "UnicodeDecodeError: 'ascii' codec can't decode byte 0xbd in position 29: ordinal not in range(128)"

我的问题:为什么错误信息e[0]用Latin-1编码?默认编码是Ascii,这好像是 unicode() 期望。

平台为 Ubuntu 9.04、Python 2.6.2

最佳答案

e[0] 没有用 latin-1 编码;碰巧字节\xbd 在解码为 latin-1 时是字符 U+00BD。

转换发生在 Objects/floatobject.c 中。

首先,必须将 unicode 字符串转换为字节字符串。这是使用 PyUnicode_EncodeDecimal() 执行的:

if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
PyUnicode_GET_SIZE(v),
s_buffer,
NULL))
return NULL;

unicodeobject.c 中实现。它不执行任何类型的字符集转换,它只是写入值等于字符串的 unicode 序数的字节。在这种情况下,U+00BD -> 0xBD。

格式化错误的语句是:

PyOS_snprintf(buffer, sizeof(buffer),
"invalid literal for float(): %.200s", s);

其中 s 包含之前创建的字节串。 PyOS_snprintf()写的是字节串,s是字节串,直接include就可以了。

关于python - 异常消息的默认编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1369089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com