【发布时间】: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