You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IBM i系列(AS400) COBOL程序生成的X'05'字段分隔符在Java中的等价实现问题

IBM i系列(AS400) COBOL程序生成的X'05'字段分隔符在Java中的等价实现问题

嘿,我来帮你搞定这个问题!首先咱们理清核心点:你要在Java里生成和AS400 COBOL程序一样的、用X'05'作为字段分隔符的文件,但目前用\u0005写出后在Notepad++里显示成了“ENQ”,和样本里的黄色高亮符号不一样,对吧?

问题本质分析

首先要明确:COBOL里的X'05'就是十六进制值为05的字符,对应Unicode里的\u0005(也就是ENQ控制字符),在windows-1252编码下,这个字符对应的字节就是0x05,和COBOL程序生成的完全一致。你看到的显示差异,其实是Notepad++的控制字符显示设置问题,而不是你写入的字符不对。

解决步骤

1. 调整Notepad++显示设置,让0x05显示为黄色高亮符号

你可以修改Notepad++的显示选项:

  • 点击顶部菜单栏的「视图」→「显示符号」
  • 取消勾选「显示控制字符的名称」(或者切换到「显示所有字符」但不启用控制字符名称显示)
    这样0x05就会显示成和你样本里一样的黄色高亮符号,而不是“ENQ”字样。

2. 确保Java代码写入的字节完全匹配COBOL生成的文件

如果你想更稳妥地保证字节一致,可以直接用字节流写入0x05,避免字符流编码转换可能带来的(其实这里不会有,但更直观)问题。修改你的代码如下:

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class GenerateFile {
    public static void main(String[] args) throws IOException {
        List<Object[]> data = new ArrayList<>();

        data.add(new Object[] { "AS1", "185914", "NETHERLANDS", "NL", "", "202023714", "2023714", "27-AUG-2022",
                "03-FEB-2023", "", "", "00000000", "IF-ADAMAS", "", "PTF166091NL00",
                "P166091NL00", "", "", "", "", "IF ADAMAS B V" });

        data.add(new Object[] { "AS1", "20200893", "GERMANY", "DE", "", "13801864.3", "2915188",
                "05-NOV-2022", "22-FEB-2023", "R80049", "10", "00000434", "MICRONIT M", "",
                "PTF124241DEEP", "P118354DEEP", "", "", "", "",
                "MICRONIT MICROFLUIDICS B.V." });

        FileOutputStream fos = new FileOutputStream("output.XLS");
        // 处理表头,把\t替换为\u0005后转成windows-1252字节
        String header = "\"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";
        byte[] headerBytes = header.replace("\t", "\u0005").getBytes("windows-1252");
        fos.write(headerBytes);

        // 处理每一行数据
        for (Object[] row : data) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < row.length; i++) {
                sb.append("\"").append("\u00a0").append(row[i].toString()).append("\"");
                if (i < row.length - 1) {
                    sb.append("\u0005"); // 使用\u0005作为字段分隔符
                }
            }
            sb.append("\n");
            byte[] rowBytes = sb.toString().getBytes("windows-1252");
            fos.write(rowBytes);
        }

        fos.close();
        System.out.println("Done");
    }
}

这段代码直接将字符串转换为windows-1252编码的字节写入文件,确保\u0005对应的字节就是0x05,和COBOL程序生成的完全一致。

额外验证

你可以用Notepad++的「编辑」→「十六进制编辑」功能,打开你生成的文件和样本文件,对比十六进制值,确认0x05的位置是否一致——这样就能100%保证文件内容匹配了。

备注:内容来源于stack exchange,提问作者EthanP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:07:57