【问题标题】:UnicodeDecodeError: 'ascii' codec... when trying to encode a structure for JavaScriptUnicodeDecodeError: 'ascii' codec ...尝试为 JavaScript 编码结构时
【发布时间】:2012-12-26 02:00:18
【问题描述】:

我正在尝试从 python 结构中创建一个 unicode 字符串。我不想使用 python 的默认字符串转换方法,因为我希望这个 unicode 字符串具有特定的结构,以便我可以在 javascript 客户端中使用它。我在

行得到了 UnicodeDecodeError
dlist_str += unicode(item[key])

我试过了

# -*- encoding: utf-8 -*-

在文件的顶部。我也用

尝试了问题行
dlist_str += item[key]

希望 str 类型会自动转换为 unicode。我做错了什么?

这里是sn-p的代码:


def convertToString(dlist):
  dlist_str = u'{ '
  for item in dlist:
    dlist_str += item['field_id'] + u': { '
    for key in item:
      dlist_str +=  key + u': '
      dt = str(type(item[key]))
      if dt == "<type 'str'>" or dt == "<type 'unicode'>":
        dlist_str += u"'"
        dlist_str += unicode(item[key])
        dlist_str += u"'"
      elif dt == "<type 'list'>":
        dlist_str += u"["
        for dn in item[key]:
          dlist_str += u"'" + dn + u"',"
        dlist_str += u"]"
      else:
        dlist_str += unicode(item[key])
      dlist_str += u','
    dlist_str += u'},'
  dlist_str += u'}'
  return dlist_str

【问题讨论】:

  • # -*- encoding: utf-8 -*- 用于允许 vim/emacs 读取您的代码,仅考虑 utf-8 编码。请发布确切的输出,以及对函数convertToString 的调用,这样我们就可以很好地解决您的问题。 (辛普森一家)
  • @Rubens:不正确。 -*- encoding: utf-8 -*- 的特定格式是对 emacs 的提示(Vim 将使用模式行,例如 vim: fileencoding=utf-8),但 Python 确实使用 coding: utf-8 部分来指示文件是 UTF-8而不是 ASCII;如果您将 Unicode 字符不在文件内的 ASCII 范围内,例如λ,如果你没有coding: utf-8,它将导致SyntaxError,但如果你这样做,它将正常工作。见PEP 263。但请记住,这只是 source 编码。
  • @ChrisMorgan 是的,vim/emacs 之间的差异很小,但是在脚本中添加这样的东西只涉及代码,而不涉及代码处理的数据。
  • str(type(x)) == "&lt;type 'str'&gt;"?请不要。使用type(x) == str(精确类型匹配)或isinstance(x, str)(允许子类)。要一次性覆盖strunicode,您将拥有isinstance(x, basestring)
  • @Rubens:我的观点很简单,它确实也影响了 Python 的行为,尽管不是以希望的方式。

标签: javascript python python-2.7 python-unicode


【解决方案1】:

看起来您正在尝试同时做两件事:将列表转换为字典,然后对其进行 JSON 编码。

如果你把这两个步骤分开,你应该可以使用JSON Encoder in the Python Standard Library:

import json

def convertToString(dlist):
    temp_dict = dict((item['field_id'], item) for item in dlist)
    return json.dumps(temp_dict)
    # or, even shorter, and in Python 2.7/3.2+
    # return json.dumps({item['field_id']: item for item in dlist})

另外,您在版本中看到错误的原因是您需要明确选择“来自”编码,而不是让 Python 猜测。比如:

dlist_str += item[key].decode('utf-8')

可能会起作用。

【讨论】:

  • 您的 json.dumps 解决方案非常优雅。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
相关资源
最近更新 更多