我在IFS中有许多文件,它们带有各种各样的CCSID(0、37、819、1200、1252等),我的任务是编写一个简单的RPGLE [1]程序,该程序将允许用户查看这些文件的内容。
我们的系统(V6R1)CCSID(DSPSYSVAL QCCSID)为65535 [2],我们的作业的默认CCSID为37,这意味着当我尝试显示CCSID 819(ASCII)时,例如,我看到垃圾–符号,随机颜色等。
我熟悉通过QtqIconvOpen API将数据从一个CCSID转换为另一个CCSID,因此,如果我知道文件的CCSID与我们的默认CCSID不同,则可以进行转换。几年前我写了代码来做到这一点,而且效果很好。
我的问题是以编程方式找出IFS文件的CCSID。谷歌搜索之后,我发现的唯一相关信息是JamesA(How to determine the CCSID used in CPYFRMIMPF command?)在Stackoverflow上提供的信息,他指出您可以在QSHELL中执行“ ls -S”以获取显示其CCSID和文件名的文件的列表。
因此,从理论上讲,我可以执行ls -S filename
,解析输出以获取CCSID,然后在必要时使用该CCSID进行数据转换。但是,这是一个丑陋的破解,如果可能的话,我更喜欢使用IBM API。
有谁知道这样的API或比解析ls -S filename
列表更优雅的技巧?
[1]我使用C API的open()
,read()
和close()
进行实际的数据读取。
[2]我知道65535是一个糟糕的选择,但是对此我无能为力。
最佳答案
看起来Qp0lGetAttr()
"Get Attributes" API可以让您指定一组属性以检索特定文件,包括一个称为QP0L_ATTR_CCSID
的文件。
Here's an example of this API in use from RPG.包含GetAttr调用的示例在ZIP file linked from that page中。