FTP 从 Java 应用程序到大型机数据集 - open/close 括号问题

FTP from Java application to mainframe dataset - issue with open/close brackets

解决方案: 除了根据 Bruce Martin 的回答将 charset/codepage 设置为 cp037 之外,我还必须更改 FTP 逻辑中的设置(使用 apache commons net)。我必须将文件类型设置为 EBCDIC。这里有一些示例代码来展示我在做什么。

public FTPClient openFTPConnection() {
    String server = [server];
    int port = [port];
    int reply;
    FTPClient ftpClient = new FTPClient();
    ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
    try {
        ftpClient.connect(server, port);
        reply = ftpClient.getReplyCode();
        System.out.println(reply);
        if (!FTPReply.isPositiveCompletion(reply)) {
            System.out.println(reply);
            ftpClient.disconnect();
            throw new Exception("Exception in connecting to FTP Server");
        }
        ftpClient.login(user, pass);
        ftpClient.setFileType(FTP.EBCDIC_FILE_TYPE); 
        //Previously, this was set to FTP.ASCII_FILE_TYPE
        ftpClient.enterLocalPassiveMode();
    } catch (Exception e) {
        System.out.println("Error: " + e.getMessage());
        e.printStackTrace();
    }
    return ftpClient;
}
public List ftpStoreAuthData(FTPClient ftpClient) {
    try {
        String mainframeDataSet = [dataset];
        InputStream stream = ftpClient.retrieveFileStream(mainframeDataSet);
        logger.trace("Retrieving mainframe data set...");
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "cp037"));
                                                   //Previously, this was set to "utf-8"
        logger.trace("Data set Retrieved!");
        String datasetText;
        while((datasetText = reader.readLine()) != null) {
             //do things with dataset records
        }
        return new ArrayList<>();
    }

我正在 Java 中开发 REST 应用程序。我的一个 REST 端点向大型机发出 FTP 请求并检索其中包含“[”和“]”字符的数据集。

我试过使用 Apache Commons Net 和 Spring 的 sftpsessionfactory FTP 库。在这两种情况下,open/close 括号字符都作为 �s 返回到我的应用程序。当我从我检索的数据集中读取每条记录时,有一个 if 条件检查特定记录是否包含“[”或“]”字符,显然它失败了。

作为一种 hack,我更改了 if 条件,以便它检查 �s。这有效并且是一个快速修复。此解决方法的问题在于,当我最终 FTP 将数据集返回到大型机时,它最终会成为一个问题。我用“[]'s, but when the file hits the mainframe the open bracket appears as 'Ý”覆盖了�s,右括号显示为“¨”。我在大型机上使用 "HEX ON" 命令来查看所需的 open/close 括号和我发送的 open/close 括号之间的区别。

我发送的左括号 (Ý) 的十六进制值为 AD。 数据集所需的左括号具有十六进制值 BA.

我发送的右括号 (¨) 的十六进制值为 BD。 数据集所需的右括号具有十六进制值 BB。

如何编写括号以匹配数据集所需的十六进制值?另外,当我检索数据集时,如何才能使括号不显示为 �s?我听说这个问题与不同的 EBCDIC 代码页转换有关,这很好,但我不确定如何解决这个问题。

如果您需要查看我的 FTP 代码,请告诉我。如果需要,我可以 post。

可以使用合适的EBCDIC字符集 IBM037/CP037是US EBCDIC。还有很多其他的,例如德国/奥地利使用cp273

你可以做到

    Reader r = new InputStreamReader(in, "cp037");
    String s = new String(bytes, "cp037");
       // or for 3 spaces
    String spaces = new String(new byte[] {40, 40, 40}, "cp037");

读取 EBCDIC 流/将数组字节转换为文本