Python UnicodeEncodeError与我的代码

Python UnicodeEncodeError与我的代码,python,unicode,ascii,non-ascii-characters,Python,Unicode,Ascii,Non Ascii Characters,我的用户信息列表中的UnicodeEncodeError有问题: {u'\u0633\u062a\u064a\u062f@nimbuzz.com': {'UserName': u'\u0633\u062a\u064a\u062f@nimbuzz.com', 'Code': 5, 'Notes': '', 'Active': 0, 'Date': '12/07/2014 14:16', 'Password': '560pL390T', 'Email': u'yuyb0y@gmail.com'}}

我的用户信息列表中的UnicodeEncodeError有问题:

{u'\u0633\u062a\u064a\u062f@nimbuzz.com': {'UserName': u'\u0633\u062a\u064a\u062f@nimbuzz.com', 'Code': 5, 'Notes': '', 'Active': 0, 'Date': '12/07/2014 14:16', 'Password': '560pL390T', 'Email': u'yuyb0y@gmail.com'}}
我需要运行以下代码来获取用户信息:

def get_users_info(type, source, parameters):
    users_registertion_file = 'static/users_information.txt'
    fp = open(users_registertion_file, 'r')
    users_information = eval(fp.read())
    if parameters:
        jid = parameters+"@nimbuzz.com"
        if users_information.has_key(jid):
            reply(type, source, u"User name:\n" +str(users_information[jid]['UserName'])+ u"\nPassword:\n" +str(users_information[jid]['Password'])+ u"\nREG-code:\nP" +str(users_information[jid]['Code'])+ u"\nDate:\n" +str(users_information[jid]['Date'])+ u"\naccount status:\n " +str(users_information[jid]['Active']))
        else:
            reply(type, source, u"This user " +parameters+ u"  not in user list")
    else:
        reply(type, source, u"write the id after command")
但是,当我试图获取用户信息时,会出现以下错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
我尝试使用
unicode('utf8')
jid
进行unicode编码:

但我得到了同样的错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
请了解如何解决此问题,如您所见,users\u信息列表中的用户名键如下所示:

u'\u0633\u062a\u064a\u062f@nimbuzz.com'

以及位于txt文件中的用户信息列表。

除非
jid
是unicode字符串,否则无法找到用户信息。确保此处的
parameters
是unicode值,这样在此处使用起来会更方便:

如果使用编码的bytestring,Python将而不是在字典中查找您的用户名,因为它不知道您对字符串使用了什么编码,也不会隐式解码或编码以进行比较

接下来,在未指定编解码器的情况下,无法对Unicode值调用
str()

str(users_information[jid]['UserName'])
如果
用户信息[jid]['UserName']
包含ASCII码点以外的任何内容,则这将保证引发
UnicodeEncodeError
异常

您需要始终使用Unicode值,将值的编码保留到最后一刻(最好将其保留到库中)

您也可以在此处对
unicode
对象使用字符串格式:

reply(type, source, 
      u"User name:\n{0[UserName]}\nPassword:\n{0[Password]}\n"
      u"REG-code:\nP{0[Code]}\nDate:\n{0[Date]}\n"
      u"account status:\n {0[Active]}".format(users_information[jid]))
这将插入来自
users\u information[jid]
的各种键,而无需对每个值调用
str

请注意,
dict.has_key()
已被弃用;使用中的
操作符测试钥匙:

if jid in users_information:
最后但并非最不重要的一点是,如果可以避免,请不要使用
eval()。对于文件格式,您应该在此处使用JSON,但如果您无法影响JSON,则至少在文件内容上使用JSON,而不是
eval()
,并将允许的输入限制为仅使用Python文字语法:

import ast

# ...

users_information = ast.literal_eval(fp.read())

几年前我遇到了一些问题:

jid = parameters+"@nimbuzz.com"
一定是

jid = parameters+u"@nimbuzz.com"
并将其放在第一行或第二行:

#coding:utf8
Martijn Pieters示例-在我的机器上

Python 2.7.8 (default, Jul  1 2014, 17:30:21) 
[GCC 4.9.0 20140604 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a=u'asdf'
>>> b='ваывап'
>>> a+b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
>>> c=u'аыиьт'
>>> a+c
u'asdf\u0430\u044b\u0438\u044c\u0442'
>>>
Python 2.7.8(默认,2014年7月1日17:30:21)
linux2上的[GCC 4.9.0 20140604(预发布)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>a=u'asdf'
>>>b=‘ааааП’
>>>a+b
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeDecodeError:“ascii”编解码器无法解码位置0中的字节0xd0:序号不在范围内(128)
>>>c=u‘аааааааааа
>>>a+c
u'asdf\u0430\u044b\u0438\u044c\u0442'
>>>

您能显示错误发生在哪一行吗?发布完整的回溯?报告(参数)
看起来像什么?您的错误的完整回溯是什么,在所有情况下都完全相同吗?我在第8行Quick hack中得到错误:
来自uuu future\uuuuu导入unicode\u文字
?@bluebelle:除非您知道自己在做什么并且需要Python 3兼容性,否则这不是一个好主意。OP不知道他们在这里做什么,
unicode\u literals
不会修复
str()
调用。我尝试了你写的内容,在第10行得到了答案。用户不在list@user3658169:完全正确,因为您的密钥是Unicode,但您只使用bytestring进行测试。不,将Unicode与ASCII bytestring串联是完全有效的,不会导致编码错误。PEP 263评论对隐式解码或编码没有任何影响,请不要只是使用这些评论。OP在此未使用非ASCII源代码。
>>参数=u'\u0633\u062a\u064a\u062f'
,然后
>>参数+“@nimbuzz.com”
给出
u'\u0633\u062a\u064a\u062f@nimbuzz.com例如,
。@eri感谢您的回复和帮助。但我不明白如何使用ast.literal\u eval()你的意思是我使用类似ast.literal\u eval(fp.read())?如果我使用
eval()
:SyntaxError:(unicode错误)'UnicodeScape'编解码器无法解码位置12-14中的字节:截断\uxxx转义
#coding:utf8
Python 2.7.8 (default, Jul  1 2014, 17:30:21) 
[GCC 4.9.0 20140604 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a=u'asdf'
>>> b='ваывап'
>>> a+b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
>>> c=u'аыиьт'
>>> a+c
u'asdf\u0430\u044b\u0438\u044c\u0442'
>>>