Create Java file with special hidden (non-printable and invisible?) characters of IBM I series (AS400) problem

问题描述 投票:0回答:1

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

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

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

用excel打开是这样的: 正如您在内容开头看到的那样,您会看到那些 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 的文件时,我什么也看不到

尽管您会看到该文本文件中有空白。但是,如果您在我生成的 excel 文件中打开此文件: 你可以看到它有我放在代码中的奇怪字符! 如何在 Java 中创建一个文本文件来输出“XLS / TXT”文件,如 IBM I 系列(AS400)cobol 程序?有人可以帮我吗?

java file ibm-midrange cobol rpgle
1个回答
1
投票

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

所以要生成一个类似的文件,你也必须用字符集 1252 编写它,并在你的 java 字符串中使用 \u00A0,这样当 writen java nio 将它从 \u00a0 翻译成 \xa0

FileWriter writer = new FileWriter("output.XLS", Charset.forName("windows-1252"));
writer.write("\u00a0");
© www.soinside.com 2019 - 2024. All rights reserved.