编码欧洲口音的Python字符

时间:2014-04-27 16:55:19

标签: python python-2.7 unicode utf-8 character-encoding

我知道这不是一个不常见的问题,并且已经有多个SO问题得到了解答(123),但即使遵循那里的建议,我也是我仍然看到这个错误(对于下面的代码):

uri_name = u"%s_%s" % (name[1].encode('utf-8').strip(), name[0].encode('utf-8').strip()) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)

所以我想从一个艺术家名单列表中获取一个网址,其中很多都有重音和欧洲字符这样(他们的名字也通过repr印有特殊字符):

Auberjonois, René -> Auberjonois, Ren\xc3\xa9
Bäumer, Eduard -> B\xc3\xa4umer, Eduard
Baur-Nütten, Gisela -> Baur-N\xc3\xbctten, Gisela
Bösken, Lorenz -> B\xc3\xb6sken, Lorenz
Čapek, Josef -> \xc4\x8capek, Josef
Großmann, Rudolf -> Gro\xc3\x9fmann, Rudolf

我试图运行的块是:

def create_uri(artist_name):

  artist_name = artist_name

  name = artist_name.split(",")

  uri_name = u"%s_%s" % (name[1].encode('utf-8').strip(), name[0].encode('utf-8').strip())

  uri = 'http://example.com/' + uri_name

  print uri

create_uri('Name, Non_Accent')
create_uri('Auberjonois, René')

所以第一个工作并产生http://example.com/Non_Accent_Name 但第二个因上述错误而失败。

我已将# coding=utf-8添加到我的脚本顶部,并尝试在整个过程中的每个点编码artist_name字符串,但每次都会得到相同的错误。

如果重要,我使用Atom作为文本编辑器,当我打开这些名称所来自的.csv文件时,重音符号都会正确显示。

我还能做些什么来确保脚本将UTF-8解释为UTF-8而不是ascii?

2 个答案:

答案 0 :(得分:1)

停止使用UTF-8。在任何地方使用unicode,并且只在接口处解码/编码(如果需要)。

def create_uri(artist_name):
  name = artist_name.split(u",")
  uri_name = u"%s_%s" % (name[1].strip(), name[0].strip())
  uri = u'http://example.com/' + uri_name
  print uri

create_uri(u'Name, Non_Accent')
create_uri(u'Auberjonois, René')

答案 1 :(得分:1)

正如我在print语句中看到的那样,你正在使用python 2.x.这意味着您应该通过\u表示法定义unicode字符,或者为字符串使用u前缀。所以,只需将您的行改为

即可
create_uri(u'Auberjonois, René') # note the u''

此外,在拆分后,您似乎不需要为您的部件编码。它已经是unicode