我正在使用Java/JT400驱动程序将应用程序集成到AS400中。从参数文件中提取数据时遇到问题 - 检索到的数据似乎已编码。
SELECT SUBSTR(F00001,1,20) FROM QS36F."FX.PARA" WHERE K00001 LIKE '16FFC%%%%%' FETCH FIRST 5 ROWS ONLY
输出
00001: C6C9D9C540C3D6D4D4C5D9C3C9C1D34040404040, - 1
00001: C6C9D9C5406040C3D6D4D4C5D9C3C9C1D3406040, - 2
如何将其转换为可读格式?有没有可以用来解码的函数?
在与AS400的终端连接上,信息通过相同的SQL查询正确显示。
在此之前,我没有使用AS400的经验,真的可以使用一些帮助。此问题仅与参数文件有关。 数据库表工作正常。
您看到的是EBCDIC输出而不是ASCII。 这是由于CCSID没有像其他答案中提到的那样在数据库中指定。 理想的解决方案是将 CCSID 分配给数据库中的字段。 如果您没有能力这样做,并且无法说服负责人这样做,那么以下解决方案也应该有效:
SELECT CAST(SUBSTR(F00001,1,20) AS CHAR(20) CCSID(37))
FROM QS36F."FX.PARA"
WHERE K00001 LIKE '16FFC%%%%%'
FETCH FIRST 5 ROWS ONLY
将 CCSID替换为您需要的任何 CCSID。 CCSID的定义可以在这里找到:https://www-01.ibm.com/software/globalization/ccsid/ccsid_registered.html
由于该文件在 QS36F 中,我猜该文件是一个平面文件,而不是外部定义的......因此,如果通过SQL访问文件中的数据,则必须手动解释文件中的数据。
在对字段进行子串串后,可以尝试将其转换为字符格式。
(我手边没有S/36文件,所以我真的不能尝试(
它是 EBCDIC 中文本的十六进制字节,即 AS/400 字符集。
static String fromEbcdic(String hex) {
int m = hex.length();
if (m % 2 != 0) {
throw new IllegalArgumentException("Must be even length");
}
int n = m/2;
byte[] bytes = new byte[n];
for (int i = 0; i < n; ++i) {
int b = Integer.parseInt(hex.substring(i*2, i*2 + 2), 16);
bytes[i] = (byte) b;
}
return new String(bytes, Charset.forName("Cp500"));
}
传递"C6C9D9C540C3D6D4D4C5D9C3C9C1D34040404040"。
将Cp500的文件转换为字符集:
Path path = Paths.get("...");
List<String> lines = Files.readAllLines(path, Charset.forName("Cp500"));
对于 AS/400 上的行尾 NEL 字符 U+0085,可以使用正则表达式:
content = content.replaceAll("\R", "rn");
正则表达式R
将只匹配一个换行符,是否r, n, rn, u0085
.
非常感谢您提供的所有答案,它们都是正确的。
它是AS400中的一个平面参数文件,我无法控制系统中的任何内容。因此,它必须在 SQL 查询的运行时或一旦收到。
我完全不知道代码页是什么,因为我之前没有使用AS400和其中文件的经验。因此,您的所有答案都有助于解决和启发我。:)
所以,最好的答案是最后一个。我已经按如下方式更改了 SQL,并得到了所需的结果。
SELECT CAST(F00001 AS CHAR(20) CCSID 37) FROM QS36F."FX.PARA" WHERE K00001 LIKE '16FFC%%%%%' FETCH FIRST 5 ROWS ONLY
00001: 消防广告 , - 1 00001: 火 - 商业 - , - 2
再次感谢。
迪兰克