0

我正在使用 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 的经验,我真的可以使用一些帮助。此问题仅与参数文件有关。数据库表工作正常。

4

4 回答 4

2

您看到的是 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 定义可在此处找到:https ://www-01.ibm.com/software/globalization/ccsid/ccsid_registered.html

于 2018-10-25T16:02:46.903 回答
1

由于该文件位于 QS36F 中,我猜该文件是一个平面文件,而不是外部定义的......所以如果通过 SQL 访问文件中的数据,则必须手动解释。

您可以尝试将字段转换为字符格式,然后再将其转换为字符格式。

(我手边没有 S/36 文件,所以我真的不能尝试)

于 2018-10-25T14:13:57.560 回答
0

它是 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", "\r\n");

正则表达式\R将完全匹配一个换行符,无论\r, \n, \r\n, \u0085.

于 2018-10-25T14:37:41.873 回答
0

非常感谢您提供的所有答案,它们都是正确的。

它是 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

再次感谢。

迪兰克

于 2018-10-26T10:47:21.823 回答