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

解析含日文的XML生成文本文件时字符丢失且粘贴后恢复的问题

解决XML解析日文字符丢失/显示异常的问题

嘿,这个问题我之前处理过类似的,咱们一步步拆解原因和解决办法:

问题根源:编码不一致导致的字符损坏

你碰到的核心问题是读取XML和写入文件时的编码没有统一为UTF-8,而且Java的FileReader/FileWriter默认会用系统平台的编码(比如Windows下的GBK),这就导致了字符在读写过程中被错误转码:

  1. 读取XML时的坑:你用了FileReader读取XML,然后给InputSource设置UTF-8编码,但FileReader是字符流,它已经提前把文件的字节按系统默认编码转成了字符,setEncoding("UTF-8")这个设置对已经存在的字符流完全无效——等于你先把UTF-8的XML用GBK解码成了乱码字符,再交给解析器,自然拿到的data本身就是损坏的。
  2. 写入文件时的隐患:FileWriter同样用系统默认编码写入,你直接写字符串正常只是巧合(比如你的系统编码刚好能覆盖这些日文),但这是不可靠的,换个平台或者遇到生僻字符就会出问题。

至于复制粘贴后恢复正常?那是因为损坏的字符写入文件后,当你复制到支持UTF-8的编辑器时,编辑器自动尝试用UTF-8解码,刚好把两次错误转码的结果又转回来了——这是偶然现象,不是解决办法。

正确的解决步骤

1. 正确读取UTF-8编码的XML

放弃FileReader,改用字节流读取XML,这样解析器才能正确识别UTF-8编码:

File fXmlFile = new File("D:\\Test\\test_BULK.xml");
// 用字节流传入InputSource,让解析器按指定编码处理
InputSource is = new InputSource(new FileInputStream(fXmlFile));
is.setEncoding("UTF-8");

// 后续解析代码不变
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
doc.getDocumentElement().normalize();

如果你的XML文件开头已经有标准的编码声明:<?xml version="1.0" encoding="UTF-8"?>,那更简单,直接让解析器自动识别编码就行:

Document doc = dBuilder.parse(fXmlFile); // 解析器会读取XML开头的编码声明,自动用UTF-8解析

2. 用UTF-8编码写入文件

FileWriter无法指定编码,改用OutputStreamWriter配合FileOutputStream,明确指定UTF-8:

// 用try-with-resources自动关闭流,更安全
try (OutputStreamWriter fileWriter = new OutputStreamWriter(
        new FileOutputStream("D:\\Test\\test.txt"), StandardCharsets.UTF_8)) {
    // 解析得到data后写入
    fileWriter.write(data);
    fileWriter.flush();
} catch (IOException e) {
    e.printStackTrace();
}

验证效果

按照上面的方法修改后,无论是解析XML得到的字符,还是直接写入字符串,都会以UTF-8编码保存到文件里,编辑器打开时也能直接显示正确的日文,不会再出现“复制才正常”的怪异现象。

内容的提问来源于stack exchange,提问作者The Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:57:27