java - 创建具有IBM I系列(AS400)特殊隐藏(不可打印和不可见?)字符的Java文件问题

标签 java file ibm-midrange cobol rpgle

我正在尝试创建一个“XLS”文件,但它将作为 txt 文件提供。 (这意味着当您右键单击并选择在窗口中打开并选择记事本时,它将显示为制表符分隔的文件)

这是我尝试创建的示例文件(我必须删除一些条目,因为它很大)。当你在notepad++中将其转为UTF-8时,你会看到“隐藏字符” https://docs.google.com/spreadsheets/d/1q_AkGaQK8Glc6OzmVl4gRmItO4Ojnq7G/edit?usp=sharing&ouid=113904619378239546124&rtpof=true&sd=true

当您下载此文件并在 Notepad++ 中打开它时。选择编码为UTF-8。您将能够看到那些隐藏的字符: Sample file

用excel打开是这样的: enter image description here 正如您在内容开头所看到的,您将看到那些 xA0 作为隐藏字符。 现在我知道AS400使用EBCDIC字符代码。

这是他们放入 cobol 程序中的代码:

HSPACE PIC X VALUE X'41'

Java 中的隐藏字符相当于什么?

我在下面创建了一个测试程序:

 List<Object[]> data = new ArrayList<>();
            data.add(new Object[]{"\u0020 AS1", "185914", "\u0020 NETHERLANDS", "NL", "A0", "\u00202023714", "\u00A02023714", "27-AUG-2022", "03-FEB-2023", "\u00A0", "\u00A04", "00000000", "\u00A0IF-ADAMAS", "\u00A0", "\u00A0PTF166091NL00", "\u00A0P166091NL00", "\u00A0", "\u00A0", "\u00A0", "\u00A0", "\u00A0IF ADAMAS B V"});
            data.add(new Object[]{"\u0020 AS1", "\u0020200893", "\u0020 GERMANY", "DE", "\u00A0", "\u00A013801864.3", "\u00A02915188", "05-NOV-2022", "22-FEB-2023", "\u00A0R80049", "\u00A010", "00000434", "\u00A0MICRONIT M", "\u00A0", "\u00A0PTF124241DEEP", "\u00A0P118354DEEP", "\u00A0", "\u00A0", "\u00A0", "\u00A0", "\u00A0MICRONIT MICROFLUIDICS B.V."});

            FileWriter writer = new FileWriter("output.XLS", StandardCharsets.UTF_8);
            
            writer.write("\"Client\"\t\"Case Number\"\t\"Country\"\t\"WIPO\"\t\"Subcase\"\t\"Application Number\"\t\"Patent Number\"\t\"Due Date\"\t\"Paid Date\"\t\"Invoice Number\"\t\"Annuity Number\"\t\"Invoice Amount\"\t\"Client/Division\"\t\"Client Ref(Inv)\"\t\"Client Ref#1(Ctry)\"\t\"Client Ref#2(Ctry)\"\t\"Attorney(Inv)\"\t\"Attorney(Ctry)\"\t\"Remarks\"\t\"Local Title\"\t\"Title Holder\"\n");

            for (Object[] row : data) {
                for (int i = 0; i < row.length; i++) {
                    writer.write("\"" + row[i].toString() + "\"");
                    if (i < row.length - 1) {
                        writer.write("\t");
                    }
                }
                writer.write("\n");
            }

            writer.close();
            System.out.println("Done");

但是,当我在 Notepad++ 中以UTF-8编码打开该文件时,我什么也看不到 enter image description here

尽管您会看到该文本文件中存在空格。但是,如果您在我生成的 Excel 文件中打开此文件: enter image description here 您可以看到我在代码中放入了奇怪的字符! 如何在 Java 中创建一个像 IBM I 系列(AS400)cobol 程序一样输出“XLS/TXT”文件的文本文件?有人可以帮我解决这个问题吗?

最佳答案

AS400 生成的文件(可能)使用 windows 1252 字符集进行编码,notepad++ 将其命名为 ansi。当您将其显示为 utf8 时,您会看到 XA0,因为它的编码方式在 utf-8 中是非法的。

因此,要生成类似的文件,您也必须使用字符集 1252 编写它,并在 java 字符串中使用\u00A0,以便在编写 java nio 时将其从\u00a0 转换为\xa0

FileWriter writer = new FileWriter("output.XLS", Charset.forName("windows-1252"));
writer.write("\u00a0");

关于java - 创建具有IBM I系列(AS400)特殊隐藏(不可打印和不可见?)字符的Java文件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75892060/

相关文章:

android - 读取android list 文件

将文件放到 iSeries 上时 Python ftplib 错误 426

ibm-midrange - Windows XP下使用map网盘访问AS400 IFS时反复提示输入用户名和密码

java - 在 spring-boot 2.6.2 迁移之后 Junit (4.12) 没有执行

java - 如何从 POJO 类中的 Firestore 集合中检索所有文档?

file - 使用 Spring 从 csv 文件读取数据运行测试

sql - AS400 SQL查询类似于原生AS400中的CLRLIB(清库)

java - 使两个字符串中的空格匹配

java - 当线程被销毁时,变量会被销毁吗?

java - 使用 ContentHandler 提取文件内容