ASCII编解码器不能编码字符u'\ u2013'

时间:2016-10-14 09:07:06

标签: python unicode

我在Q_GIS中有一些Python代码可以打开对象。我遇到的问题是在目录中有一个无法编码的字符(下划线像字符)。错误是:

  

Traceback(最近一次调用最后一次):文件“”,第1行,in   UnicodeEncodeError:'ascii'编解码器无法对字符u'\ u2013'进行编码   位置10:序数不在范围内(128)

我的小代码是:

from os import startfile; 
proj = QgsProject.instance(); 
UriFile = str(proj.fileName()); 
img = '[% "pad" %]'; 
Path = str(os.path.dirname(UriFile)); 
startfile(Path+img)

由于我的编程技巧很少,我请你帮助我在这个小代码中添加一些代码来克服这个问题。

3 个答案:

答案 0 :(得分:5)

我假设:

  • 您使用的是Python2版本
  • QgsProject.instance().fileName()是一个包含EN-DASH的Unicode字符串(Unicode char U + 2013: - ),它看起来像普通的短划线(Unicode char U + 2D: - ),但在ASCII或任何字母中都不存在常见的8位字符集。

错误是正常的:在Python2中,unicode字符串转换为普通的8bits字符串使用ASCII字符集。

解决方法:
您可以使用显式编码,要求将替换字符用于未映射的字符:

UriFile = proj.fileName().encode('ascii', 'replace')

至少你会看到有问题的角色出现在哪里。

解决方案:

您应该使用完整的unicode处理(并使用Python3)或确保所有处理的字符串都可以在您当前的字符集中表示(通常是latin1)

或者,如果在您的用例中有意义,您可以尝试使用UTF8编码,该编码可以成功地表示1,2或3个字节中的任何UNICODE字符:

UriFile = proj.fileName().encode('utf8')

答案 1 :(得分:0)

感谢您的回答,

我在python代码中找到了用unicode替换str的答案,请参阅下面的代码。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    updateBorderShape()
}

func updateBorderShape() {
    borderShape.bounds = webView.bounds
    borderShape.position = CGPoint(x: borderShape.bounds.width/2, y: borderShape.bounds.height/2)
}

答案 2 :(得分:0)

经过大量搜索后,我找不到方法,但是我可以忽略它

OBJECT。encode('ascii','ignore')