我面临着 ArcPy 和 Python 编码之间的奇怪行为。我使用 VisualStudio 2010 Shell 并安装了用于 VS (PTVS) 的 Python 工具。我通过一个简单的脚本文件隔离了我的问题。包含以下命令的 py 脚本文件。在 VisualStudio 中,我已将“高级保存选项...”设置为“无签名的 UTF-8”。该脚本只是在屏幕上打印一个重音字符串,然后导入 arcpy 模块,然后再次打印相同的字符串。导入 Arcpy 似乎改变了 Python 编码设置,但我不知道为什么,我想正确地重新建立它,因为它在原始脚本中到处都会引起一些问题。
我检查了 python « encoding » 文件夹并删除了每个 pyc 文件。比我运行脚本并生成 3 个 pyc 文件:
- cp850.pyc(对应于我的 stdout.encoding)
- cp1252.pyc(对应我的Windows环境编码)
- utf_8.pyc (适合我脚本的编码)
当 ArcPy 被导入时,会改变影响初始变量的编码。
为什么?
是否可以使用一些 Python 命令找到 ArcPy 编码 cp1252 的位置并读取它,以便我可以创建一个处理它的函数?
# -*- coding: utf-8 -*-
import sys
print ('Loaded encoding : %(t)s'%{'t':sys.getdefaultencoding()})
reload(sys) # See stackoverflow question 2276200
sys.setdefaultencoding('utf-8')
print ('Set default encoding : %(t)s'%{'t':sys.getdefaultencoding()})
print ''
texte = u'Récuperation des données'
print ('Original type : %(t)s'%{'t':type(texte)})
print ('Original text : %(t)s'%{'t':texte})
print ''
import arcpy
print ('imported arcpy')
print ('Loaded encoding : %(t)s'%{'t':sys.getdefaultencoding()})
print ''
print ('arcpy mess up original type : %(t)s'%{'t':type(texte)})
print ('arcpy mess up original text : %(t)s'%{'t':texte})
print ''
print ('arcpy mess up reencoded with cp1252 type : %(t)s'%{'t':type(texte.encode('cp1252'))})
print ('arcpy mess up reencoded with cp1252 text : %(t)s'%{'t':texte.encode('cp1252')})
raw_input()
当我运行脚本时,我得到了这些结果:
加载编码:ascii
设置编码:utf-8
原始类型:输入 'unicode'
原始文本:Récuperation des données <--- 这是正确的
import arcpy
加载编码:utf-8
arcpy mess up 原始类型:输入 'unicode'
arcpy mess up original text : R'cuperation des donn'es> <--- This is wrong
arcpy mess up ReEncode with cp1252 type : type 'str'
arcpy mess up ReEncode with cp1252 text : Récuperation des données> <--- 这是合适的使用原始的 unicode