我有一个在新服务器上运行的应用程序,它会引发一些我们以前从未见过的与unicode相关的奇怪错误,对于某些字符(例如 S with Caron )而不是其他字符(例如, e with umlaut )。应用程序已成功处理unicode字符,包括 S with Caron 在服务器A的生命周期内(大约4年)。现在迁移到服务器B,我看到这些错误,不知道如何解决。
因为代码库在两个位置都是相同的,我们在服务器A上没有看到这个错误,现在只在(新)服务器B上,我认为这不是代码中的问题本身,而是服务器上的一些配置。
两台运行Python 2.7的服务器,运行Windows Server 2008 R2的服务器A和运行Windows Server 2012 R2的服务器B.新服务器正在运行SPSS Dimensions v7,而旧服务器正在运行Dimensions v6,因此这里有很多移动部件。
Python应用程序从SPSS Statistics文件中读取元数据,并通过对象的AddNew
方法将其传递给COM对象(另一个IBM对象类型):
table = self.tom.Tables.AddNew("Table" + iTable, sideAxis + u" * " + topAxis)
topAxis
包含unicode字符串:škoda
,它在服务器A上正确传递:
'škoda'
当服务器B尝试传递以下内容时:
'\u0161koda'
这似乎表明Tables.AddNew
方法正在接收它无法处理的内容。 S with Caron ,U+0160
在服务器B上引发错误,因为SAV文件中不存在标识符\u0161koda
。 我不明白为什么它会在一台服务器上发生但不会发生在另一台服务器上。
File "D:\chartbuilder\versions\2.3\tigertom.py", line 1824, in CreateTable
table = self.tom.Tables.AddNew("Table" + iTable, sideAxis + u" * " + topAxis)
File "<COMObject <unknown>>", line 3, in AddNew
File "C:\python27\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_
result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
com_error: (-2147352567, 'Exception occurred.', (0, None, u"The expression 'qj_make * {\u0161koda}' is not valid: Unknown category '\u0161koda'", None, 0, -2147352570), None)
在这两种环境中,topAxis
似乎是basetring&amp;的实例。的unicode:
2017-05-24 13:56:48.755||INFO||topAxis is basestring: True
2017-05-24 13:56:48.755||INFO||topAxis is unicode: True
在两台服务器上,我可以打印到控制台,并将表达式写入日志文件:
print topAxis.encode('utf-8',errors='backslashreplace')
self.logger.info(u"top axis\n{}\n\t".format(topAxis))
服务器A上的日志文件:
从服务器A打印控制台:
服务器B上的控制台打印:
由于代码在服务器A上按预期工作,但在服务器B上没有,我试图确定根本原因,并希望它是服务器配置而不是IBM源代码中的错误。
我也可以在安装了Dimensions 7的笔记本电脑上复制错误。