【问题标题】:FTP from Java application to mainframe dataset - issue with open/close brackets从 Java 应用程序到大型机数据集的 FTP - 开/关括号问题
【发布时间】:2016-04-26 22:00:23
【问题描述】:

解决方案: 除了按照 Bruce Martin 的回答将字符集/代码页设置为 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 库。在这两种情况下,开/关括号字符都以 �s 的形式返回到我的应用程序。当我从我检索的数据集中读取每条记录时,有一个 if 条件检查特定记录是否包含“[”或“]”字符,显然它失败了。

作为一种技巧,我更改了 if 条件,以便改为检查 �s。这有效并且是一个快速修复。这种解决方法的问题在于,当我最终将数据集通过 FTP 传输回大型机时,它最终会成为一个问题。我用 '[ ]'s 覆盖了 �s,但是当文件到达大型机时,左括号显示为“Ý”,右括号显示为“¨”。我在大型机上使用“HEX ON”命令来查看所需的开/关括号和我发送它的开/关括号之间的区别。

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

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

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

如果您需要查看我的 FTP 代码,请告诉我。有需要我可以贴出来。

【问题讨论】:

  • 是的,代码页问题。以给出“[”的十六进制代码开头的内容以给出其他内容的十六进制代码结束。是的,ftp 代码。

标签: java character-encoding ftp mainframe apache-commons-net


【解决方案1】:

您可以使用适当的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 流 / 将数组字节转换为文本

【讨论】:

  • 谢谢!我会将此标记为正确答案,但我的 FTP 代码中还有另外一项配置我也必须这样做。除了将输入流的字符集/代码页设置为 cp037 之外,我还必须将 FTP 传输模式设置为 EBCDIC_FILE_TYPE。我已经更新了我的问题以显示此代码。
  • IBM-1140, IBM-1141 类似于 cp037(US EBCDIC),cp273(German EBCDIC) 但带有欧元字符。如果数据包含欧元字符,这将很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2019-10-11
  • 2017-08-25
相关资源
最近更新 更多