总所周知,AS400处理中文的能力比较有限,特别是在针式打印机上打印含有中文字体的报表的时候,特别容易出现乱码。这里先探讨一下AS400的 中文格式。在AS400中,存放中文字的字段都是以0x0E开头,以0x0F结尾,中间包含中文字的十六进制代码。而打印机出现乱码,很多时候是由于这对 0x0E和0x0F没有配对出现而导致的。
出于这个问题的考虑,我想做一个检测数据完整性的程序来探测某些文件是否存在没有配对的0x0e和0x0f。利用Python来完成这个功能比较方 便。
程序的第一步,需要准备被检测的数据。这一步,我从AS400将被检测的文件下载至PC,这里需要取消勾选“Trancate spaces from end of records”。因为在下面的程序中,需要按字节长度读取需检测的field。如果trancate 了 spaces,就会导致读取field的长度的不对,所以必须先取消勾选该选项。
数据准备好后,就开始python程序的设计。
在这里,我定义了一个Field类,检查的数据总有一个field是作为index的,而其他被检查的field则作为data,Field就是抽 象类。因为鉴于这几天在学习设计模式,所以用上了factory mode,也就是第二个父类AbstractFieldFactory,为index和data分别编写factory子类来实例化。
定义了Field父类后,需要再定义2个子类,IndexField 和 DataField,他们分别定义数据列的两种类型。
Row类是包含一个IndexField和一个或多个DataField,DataField检测存在不匹配的0xE和0xF,就把该行的 IndexField加入至ResultList中。
Row {IndexField, DataField, DataField, ... }
|IndexField++++++++++|DataField1++++++++++++|DataField2++++++++++++|.....
读取文件时,因为需要根据Field的长度去确定读取的字节数,所以需要用file类的read函数来实现,一开始的时候,我用readline然 后在把返回的字符串进行截取,发现readline会在遇到0x0f的时候,判断为行的结束,而不再读取0x0f后面的数据,包括0x0f字节。所以最后 还是改用read来读取,而是用read的时候,换行符是0x0D和0x0A,需要在读完所有field后空读两个字节,才开始下一行的读取。