UnicodeEncodeError:“ascii”编解码器无法对位置0-3中的字符进行编码:序号不在范围内(128)

2024-04-25 07:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

当我运行代码时,会出现以下错误:

UserId = "{}".format(source[1]) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

我的代码是:

def view_menu(type, source, parameters):
    ADMINFILE = 'static/users.txt'
    fp = open(ADMINFILE, 'r')
    users = ast.literal_eval(fp.read())
    if not parameters:
        if not source[1] in users:
            UserId = "{}".format(source[1])
            users.append(UserId)
            write_file(ADMINFILE,str(users))
            fp.close()
            reply(type, source, u"test")
        else:
            reply(type, source, u"test")

register_command_handler(view_menu, 'test', ['info','muc','all'], 0, '')

请告诉我怎样才能解决这个问题。

谢谢你


Tags: 代码intestviewformatsourceiftype
3条回答

解决方案是在sitecommize.py中将默认编码设置为utf-8而不是ascii

Changing default encoding of Python?

在处理未知编码的字符串时,使用以下函数:

你想和文本一起工作吗?

def read_unicode(text, charset='utf-8'):
    if isinstance(text, basestring):
        if not isinstance(text, unicode):
            text = unicode(obj, charset)
    return text

要存储文本,例如在数据库中,请使用以下命令:

def write_unicode(text, charset='utf-8'):
    return text.encode(charset)

问题是"{}"是非Unicode的str,而您正试图format一个unicode到其中。Python 2.x通过自动用sys.getdefaultencoding()编码unicode来处理这个问题,通常是'ascii',但是您有一些非ASCII字符。

有两种解决方法:

  1. 在适当的字符集中显式地对该unicode进行编码。例如,如果是UTF-8,则执行"{}".format(source[1].encode('utf-8'))

  2. 使用unicode格式字符串:u"{}".format(source[1])。以后您可能还需要encode这个UserId;我不知道您的write_file函数是如何工作的。但是,通常最好尽可能长时间地保持所有Unicode代码,只在边缘进行编码和解码,而不是尝试将两者混合和匹配。

尽管如此,这一行代码是无用的。"{}".format(foo)foo转换为str,然后将其格式化为完全相同的str。为什么?

相关问题 更多 >