FME Python字符串编码

本文探讨了在FME中使用Python处理字符串编码时遇到的问题。作者通过实例展示了如何获取和转换FME属性值的编码,以适应不同的系统环境。在FME 2014及更高版本中,`getAttributeEncoding()`方法已被弃用,使得处理字符串编码变得更为复杂。最后,作者指出没有通用的解决方案,必须根据具体情况进行编码处理,并警告修改`sys.setdefaultencoding`可能带来的不确定性。

原文发布时间: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并不能保证代码能产生正确的行为。所以你仍然必须了解字符串编码并自己处理这一问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值