解析含日文的XML生成文本文件时字符丢失且粘贴后恢复的问题
解决XML解析日文字符丢失/显示异常的问题
嘿,这个问题我之前处理过类似的,咱们一步步拆解原因和解决办法:
问题根源:编码不一致导致的字符损坏
你碰到的核心问题是读取XML和写入文件时的编码没有统一为UTF-8,而且Java的FileReader/FileWriter默认会用系统平台的编码(比如Windows下的GBK),这就导致了字符在读写过程中被错误转码:
- 读取XML时的坑:你用了
FileReader读取XML,然后给InputSource设置UTF-8编码,但FileReader是字符流,它已经提前把文件的字节按系统默认编码转成了字符,setEncoding("UTF-8")这个设置对已经存在的字符流完全无效——等于你先把UTF-8的XML用GBK解码成了乱码字符,再交给解析器,自然拿到的data本身就是损坏的。 - 写入文件时的隐患:
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
相关产品推荐
相关产品推荐

