Python UnicodeEncodeError与我的代码
我的用户信息列表中的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'}}
{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'
>>>