Java生成XML中£符号在Notepad++显示为xA3的解决咨询
问题:英镑符号£在Notepad++中显示为xA3的解决方法
问题描述
我用Java代码生成XML文件,其中英镑符号£在记事本(Notepad)显示正常,但在Notepad++里显示为xA3。XML文件声明编码是UTF-8,把显示异常的xA3复制粘贴回同一文件后又能正常显示。本地运行正常,但部署环境出现该问题,且两台服务器默认编码一致。

XML示例代码
<?xml version="1.0" encoding="UTF-8"?> <DataExtract xmlns:vltrdr="........." xsi:schemaLocation="D:\Apps\Test\schema/Test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"> <header> <creationDateTime>2024-04-10T06:47:15</creationDateTime> <reference>A_20240410064715</reference> </header> <letters> <letter> <reportingCurrency>GBP</reportingCurrency> <reportingCurrencySymbol>GB£</reportingCurrencySymbol> </letter> </letters> </DataExtract>
代码细节
- 使用Groovy的Markup Builder生成文件内容,未通过Markup Builder显式添加XML声明,而是手动在内容头部添加了
<?xml version="1.0" encoding="UTF-8"?> - 文件写入代码:
Path path = Paths.get(fileNameWithExtn); Files.write(path, xmlStr.getBytes());
核心原因
问题出在文件实际编码和XML声明的编码不匹配:你手动声明了UTF-8,但xmlStr.getBytes()会使用JVM默认编码(部署环境可能不是UTF-8),导致英镑符号被按其他编码(比如ISO-8859-1)写入,而Notepad++按UTF-8解析时,就会把ISO-8859-1编码的0xA3显示成乱码字符串xA3。
解决步骤
指定UTF-8编码写入文件
替换文件写入代码,显式指定UTF-8编码,确保文件实际保存为UTF-8格式:import java.nio.charset.StandardCharsets; Path path = Paths.get(fileNameWithExtn); Files.write(path, xmlStr.getBytes(StandardCharsets.UTF_8));或更简洁的写法:
Files.write(path, xmlStr, StandardCharsets.UTF_8);让Groovy Markup Builder自动生成XML声明
不要手动添加XML声明,配置Markup Builder自动生成带UTF-8编码的声明,避免手动声明和实际编码不一致:def writer = new StringWriter() def xmlBuilder = new groovy.xml.MarkupBuilder(writer) // 自动生成符合标准的XML编码声明 xmlBuilder.mkp.xmlDeclaration(version: '1.0', encoding: 'UTF-8') // 后续构建XML内容... def xmlStr = writer.toString()验证Notepad++的编码识别
打开文件后,在Notepad++顶部菜单选择「编码」→「UTF-8」(无需BOM,XML标准不推荐UTF-8 BOM);如果文件被错误识别为其他编码,可通过「编码」→「转换为UTF-8」重新保存。
内容的提问来源于stack exchange,提问作者Deepti
相关产品推荐
相关产品推荐

