我在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)
由于我的编程技巧很少,我请你帮助我在这个小代码中添加一些代码来克服这个问题。
答案 0 :(得分:5)
我假设:
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')