ASCII codec can't encode character u'u2013'
我有一个q_gis中的小python代码,它可以打开对象。我遇到的问题是,目录中有一个字符(类似于下划线的字符)无法编码。错误是:
Traceback (most recent call last): File"", line 1, in
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in
position 10: ordinal not in range(128)
我的小代码是:
1 2 3 4 5 6 | from os import startfile; proj = QgsProject.instance(); UriFile = str(proj.fileName()); img = '[%"pad" %]'; Path = str(os.path.dirname(UriFile)); startfile(Path+img) |
由于我的编程能力很差,我请求您帮助我在这个小代码中添加一些代码来克服这个问题。
我猜想:
- 您使用的是python2版本
QgsProject.instance().fileName() 是一个包含短划线(unicode char u+2013:&8211;)的unicode字符串,它看起来像一个普通的短划线(unicode char u+2d:-),但既不存在于ASCII中,也不存在于任何常见的8bits字符集中。
然后错误就正常了:在python2中,将unicode字符串转换为普通的8bit字符串使用ASCII字符集。
解决办法:您可以使用显式编码,要求对未映射的字符使用替换字符:
1 | UriFile = proj.fileName().encode('ascii', 'replace') |
至少你会看到冒犯的字符出现在哪里。
解决方案:
您应该使用完整的Unicode处理(并使用python3),或者确保所有处理的字符串都可以在当前字符集中表示(通常是拉丁语1)。
或者,如果在您的用例中有意义,您可以尝试使用utf8编码,它可以成功地用1、2或3字节表示任何Unicode字符:
1 | UriFile = proj.fileName().encode('utf8') |
谢谢你的回答,
我在python代码中找到了用unicode替换str的答案,请参见下面的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 | from os import startfile; proj = QgsProject.instance(); UriFile = unicode(proj.fileName()); img = '[%"pad" %]'; Path = unicode(os.path.dirname(UriFile)); startfile(Path+img) from os import startfile; proj = QgsProject.instance(); UriFile = unicode(proj.fileName()); img = '[%"pad" %]'; Path = unicode(os.path.dirname(UriFile)); startfile(Path+img) |