我知道这不是一个不常见的问题,并且已经有多个SO问题得到了解答(1,2,3),但即使遵循那里的建议,我也是我仍然看到这个错误(对于下面的代码):
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?
答案 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