FME Python字符串编码

原文发布时间:2015-03-27 08:52:28

作者:土豆

如果让我列举一下FME中使用Python最头疼的问题,我想一定选字符串编码。当你专注于脚本编写时,出现下面的错误一定让你感觉十分沮丧。

我试着用一个实例来帮你分析类似的问题。我要做的操作很简单,在FME中创建一个属性。

然后用Python脚本在FME Log窗口中打印这个这值。不幸的是:

要解决这个问题,我想我必须知道feature.getAttribute()方法返回的字符串编码,以及FMELogFile.logMessagString()方法能接受字符串编码。于是我编写了两个函数帮我解决第一个问题。

函数getAttributeLocalgetAttributeUnicode分别从feature中获取指定本地系统编码和Unicode编码的属性值。由于FME版本的差异,早一些的版本的FME提供feature. getAttributeEncoding()方法获取FME某个属性值编码,正如你看到的,通过这个方法,我可以在FME属性值编码和本地系统编码、Unicode之间相互转换,达到我的目的。

遗憾的是在FME 2014的后续版本中,safe取消了feature. getAttributeEncoding()方法,为此我感到不解,safe给我的回复表示,此后feature.getAttribute()都将返回Unicode编码的属性值,feature. getAttributeEncoding()方法没有必要再提供了,我想他们大概也觉得转来转去很麻烦。不过为了保证大多数FME版本上都能有正确的行为,我仍然保留了feature. getAttributeEncoding()的处理方式,用一个条件来判断当前FME是否提供这个方法。

接下来让我们看一下,为什么要定义这两个方法,并且看起来这么麻烦。我们再次测试FMELogFile.logMessagString(),输出属性值到Log窗口。

结果是我们将本地将属性值转换为本地系统编码时,我们得到了期望的结果,我的系统是windows7中文版,那么本地编码是GBK。其它两个输出都导致了字符串编码错误。

有童鞋喜欢用print打印输出,那么我们再看看在这个示例中print的行为。

没有出现错误,不过中文部分变成乱码了。在这个例子中,print接受utf8编码才能有正确的行为。

所以,最后我的结论是,对于字符串编码,没有一劳永逸的方法。你必须清楚的知道FME属性值的编码方式,并正确的使用它们,确保能产生你期望的结果。

关于sys.setdefaultencoding

我们可以修改python内部的编码方式来避免一些编码错误。在本例中我们将其设置为’utf8’,为此我修改了代码,重新设置python默认的字符编码。

运行后我们得到以下结果:

l FMELogFile.logMessagString()

l print

我只能说所有的测试方法都顺利执行了,没有发生错误,但也仅限于此。中文乱码并不是我们预期的结果,修改sys.setdefaultencoding并不能保证代码能产生正确的行为。所以你仍然必须了解字符串编码并自己处理这一问题。

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/81197982