首页 文章

ASCII编解码器可以't encode character u' \ u2013'

提问于
浏览
-2

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

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

我的小代码是:

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

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

2 回答

  • 0

    我假设:

    • 您使用的是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')
    
  • 4

    谢谢你的回答,

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

    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)
    

相关问题