【问题标题】:Python Unicode error messagePython Unicode 错误信息
【发布时间】:2013-04-07 09:48:59
【问题描述】:

我不明白这个错误代码。谁能帮帮我?

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 2: 
ordinal not in range(128)

这是代码:

import urllib2, os, zipfile
from lxml import etree

def xmlSplitter(data,separator=lambda x: x.startswith('<?xml')):
  buff = []
  for line in data:
    if separator(line):
      if buff:
        yield ''.join(buff)
        buff[:] = []
    buff.append(line)
  yield ''.join(buff)

def first(seq,default=None):
  """Return the first item from sequence, seq or the default(None) value"""
  for item in seq:
    return item
  return default

datasrc = "http://commondatastorage.googleapis.com/patents/grantbib/2011/ipgb20110104_wk01.zip"
filename = datasrc.split('/')[-1]

if not os.path.exists(filename):
  with open(filename,'wb') as file_write:
    r = urllib2.urlopen(datasrc)
    file_write.write(r.read())

zf = zipfile.ZipFile(filename)
xml_file = first([ x for x in zf.namelist() if x.endswith('.xml')])
assert xml_file is not None

count = 0
for item in xmlSplitter(zf.open(xml_file)):
  count += 1
  if count > 10: break
  doc = etree.XML(item)
  docID = first(doc.xpath('//publication-reference/document-id/doc-number/text()'))
  title = first(doc.xpath('//invention-title/text()'))
  lastName = first(doc.xpath('//addressbook/last-name/text()'))
  firstName = first(doc.xpath('//addressbook/first-name/text()'))
  street = first(doc.xpath('//addressbook/address/street/text()'))
  city = first(doc.xpath('//addressbook/address/city/text()'))
  state = first(doc.xpath('//addressbook/address/state/text()'))
  postcode = first(doc.xpath('//addressbook/address/postcode/text()'))
  country = first(doc.xpath('//addressbook/address/country/text()'))
  print "DocID:    {0}\nTitle:    {1}\nLast Name: {2}\nFirst Name: {3}\nStreet: {4}\ncity: {5}\nstate: {6}\npostcode: {7}\ncountry: {8}\n".format(docID,title,lastName,firstName,street,city,state,postcode,country)

我在互联网上的某个地方获得了代码,我只更改了一小部分,即添加了街道、城市、州、邮政编码和国家/地区。

XML 文件大约包含 200 万行代码,你认为是这个原因吗?

【问题讨论】:

  • 表示ASCII只能处理128以下的字符值,u'\xE4'是228,更大。给定您的标签,您是否在解析 XML 文档?然后你可以在源代码中加入&amp;#xE4;
  • 你是说我的 XML 的来源吗?
  • 您需要显示引发此错误的代码。您是否正在保存文件、连接字符串、进行字符串比较、打印到控制台等?
  • 对无知的人投反对票并不是帮助他的好方法。如果他只是了解正在发生的事情的基本知识,他会发布更多信息,但他没有。

标签: python character-encoding ascii


【解决方案1】:

您正在解析 XML,并且该库已经知道如何为您处理解码。 API 返回 unicode 对象,但您正试图将它们视为字节字符串。

当您调用''.format() 时,您使用的是python 字节串而不是unicode 对象,因此Python 必须编码 Unicode 值以适应字节串。为此,它只能使用默认值,即 ASCII。

简单的解决方案是在此处使用 unicode 字符串,注意 u'' 字符串文字:

print u"DocID:    {0}\nTitle:    {1}\nLast Name: {2}\nFirst Name: {3}\nStreet: {4}\ncity: {5}\nstate: {6}\npostcode: {7}\ncountry: {8}\n".format(docID,title,lastName,firstName,street,city,state,postcode,country)

Python 仍然需要在打印时对其进行编码,但至少现在 Python 可以对您的终端进行一些自动检测并确定它需要使用什么编码。

您可能想了解 Python 和 Unicode:

【讨论】:

    【解决方案2】:

    没有纯文本这样的东西。文本始终具有编码,这是您用一系列字节表示给定符号(字母、逗号、日文汉字)的方式。符号“代码”到字节之间的映射称为编码。

    在 python 2.7 中,编码文本 (str) 和通用的未编码文本 (unicode()) 之间的区别充其量是令人困惑的。 python 3 抛弃了整个事情,默认情况下你总是使用 unicode 类型。

    无论如何,发生的事情是您试图读取一些文本并将其放入字符串中,但该文本包含无法强制转换为 ASCII 编码的内容。 ASCII 只能理解 0-127 范围内的字符,这是标准的字符集(用于编程的字母、数字、符号)。 ASCII 的一种可能扩展是 latin-1(也称为 iso-8859-1),其中 128-255 范围映射到拉丁字符,例如带重音的 a。这种编码的优点是您仍然可以获得一个字节 == 一个字符。 UTF-8 是 ASCII 的另一种扩展,您可以在其中释放一个字节 == 一个字符的约束,并允许一些字符用一个字节表示,一些字符用两个字节表示,依此类推。

    要解决您的问题,这取决于。这取决于问题出在哪里。我猜您正在解析一个以您不知道的某种编码编码的文本文件,我猜它可能是 latin-1 或 UTF-8。如果这样做,则必须在 open() 中打开指定 encoding='utf-8' 的文件,但这取决于。从您提供的内容很难说。

    【讨论】:

    • 我正在解析一个 XML 文件,在 XML 文件的代码顶部,它说 &lt;?xml version="1.0" encoding="UTF-8"?&gt; 我假设 XML 文件已经是 UTF-7 编码样式?因此,如果我需要更改代码中的任何内容,最好放在哪里?
    • 不,不是 UTF-7。 UTF-8,这是不同的!无论如何,是的,xml 是以这种方式编码的,并且它确实包含非 ascii 字符,因此您需要适当的编解码器。
    • 对不起,为我的错字道歉,它是 UTF-8。 @MrLister
    【解决方案3】:

    ASCII characters 范围从 0 (\x00) 到 127 (\x7F)。您的角色 (\xE4=228) 大于可能的最高值。因此,您必须更改编解码器(例如更改为 UTF-8)才能对该值进行编码。

    【讨论】:

    • @EdwardOctavianusPakpahan 这取决于您当前的代码。如果您有u'\xe4'.encode('ascii'),只需将ascii 更改为utf-8
    • 我正在解析一个 XML 文件,&lt;?xml version="1.0" encoding="UTF-8"?&gt; 我认为它已经在 UTF-8 中了?
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2012-11-29
    • 2017-12-07
    相关资源
    最近更新 更多