关于python:ASCII编解码器不能编码字符u’-‘

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)