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 流/将数组字节转换为文本
解决方案: 除了根据 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 流/将数组字节转换为文本