Java写XML文件的中文问题:GBKUTF-8,为什么UTF-8的XML里面是GBK的中文?

时间:2023-01-06 19:31:00
大家好,我在输出XML的时候发现中文全都是用标准的GB码输出的,但是我指定输出的编码是UTF-8,为什么程序不用UTF-8输出呢?如何才能让输出的中文都是UTF-8的?

程序如下:

import java.io.*;

import org.apache.xerces.dom.DocumentImpl;
import org.apache.xml.serialize.*;
import org.w3c.dom.*;
import org.w3c.dom.Element;
public class XMLChineseTest {
public static void main(String[] argv) {
try {
Document doc = new DocumentImpl();
doc.setEncoding("UTF-8");
Element root = doc.createElement("test-root");
doc.appendChild(root);
Element firstChild = doc.createElement("test-attribute");
firstChild.setAttribute("attr", "中文测试");
root.appendChild(firstChild);

OutputFormat format = new OutputFormat(doc);
format.setLineSeparator("\n");
format.setIndenting(true);
format.setEncoding("UTF-8");
FileWriter fout = new FileWriter("test.xml");
XMLSerializer serial = new XMLSerializer(fout, format);
serial.asDOMSerializer();
serial.serialize(doc.getDocumentElement());
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

得到的XML如下:
<?xml version="1.0" encoding="UTF-8"?>
<test-root>
    <test-attribute attr="中文测试"/>
</test-root>

正确的UTF的XML应该是:
<?xml version="1.0" encoding="UTF-8"?>
<test-root>
    <test-attribute attr="涓&#65533;&#65533;娴&#65533;&#65533;"/>
</test-root>

求助,谢谢!

23 个解决方案

#1


firstChild.setAttribute("attr", new String("中文测试","ISO-8859-1");

i forgot the encode type,may be using DEFAULT and if your JDK is internation editor,or try modify ISO-8859-1 to gb2312

#2


改成
firstChild.setAttribute("attr", new String("中文测试".getBytes(),"ISO-8859-1"));
的结果:

<?xml version="1.0" encoding="UTF-8"?>
<test-root>
    <test-attribute attr="&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;"/>
</test-root>
------------------------------------
改成
firstChild.setAttribute("attr", new String("中文测试".getBytes(),"GB2312"));
的结果:

<?xml version="1.0" encoding="UTF-8"?>
<test-root>
    <test-attribute attr="中文测试"/>
</test-root>
------------------------------------

请看清我的问题:我现在能正确输出GB的中文,但是我需要的是UTF-8的!

BTW:
改成:
firstChild.setAttribute("attr", new String("中文测试".getBytes(),"UTF-8"));
的结果:

<?xml version="1.0" encoding="UTF-8"?>
<test-root>
    <test-attribute attr=""/>
</test-root>

………………

在我看来这个问题值200分的!

#3


ic,but i at hometown at netbar,not setup java and anymore,so faint

#4


原来如此,多谢了,UP!!!

#5


有没有人知道?

#6


javac -encoding UTF-8 xxx.java 试试

#7


因为直接运行上面的程序(中文是写在程序里面的GB码)会产生???????,我运行了本来的程序,结果……

所有的中文……都……还是GB的……

呜呼呀……

#8


up

#9


好变态的问题,好像无解.
不过给你一个变态解法
System.out.println(new String("中文测试".getBytes("iso_8859-1"),"utf-8"));

这是输出 ????

#10


mark

#11


to  Asprilla(dont shoot me) 

能说得详细一些?

???是不行的,一定要是正确的,可以被任何一个XML编辑器打开的UTF-8的中文……

#12


doc.setEncoding("UTF-8");这一句从何而来?

你的程序中hardcode的"中文测试"是什么编码,写到XML中自然是什么编码。因此换一个UTF-8的编辑器将你的程序中的“中文测试”换成UTF-8保存就可以了。

#13


有的Parser有doc.setEncoding("UTF-8");方法。

如果是手工的话我当然知道了,通过Java Code有没有什么办法呢?

#14


JFC似乎没有方便的转码方法,不过JDK有一个native2ascii工具可以用于转码成Latin-1 和 Unicode-encoded (\u####)字符

#15


发现The JavaTM Tutorial讲诉了转码的问题,参见:
http://java.sun.com/docs/books/tutorial/i18n/text/convertintro.html

#16


http://expert.csdn.net/Expert/topic/1388/1388190.xml?temp=.3039209

#17


xml使用 uft-8 编码,原来就是 中文的 就显示为中文,是日文就显示成日文,utf-8编码是为了统一编码才出现的,你要向别的办法了
只有你本来的字符是
"涓&#65533;&#65533;娴&#65533;&#65533;"
的时候,才能输出成这样的

#18


to All 

"涓&#65533;&#65533;娴&#65533;&#65533;"

不是我原文件的内容,这个是CSDN转码后的结果,原来的内容就是标准的乱码的UTF-8。


我问这个问题的原因是WSAD在存储XML的时候做字符转化,不知道各位有没有用过WSAD。我可以向WSAD的XML编辑器里面输入GB中文,但是只要我指定了<?xml version="1.0" encoding="UTF-8"?>这句,存储的时候这个文件中所有的GB中文都变成UTF了。

所以我觉得应该是有办法解决这个问题的,求救!

#19


我用JAXB+xml schema时当输出XML时中文全部转换成UTF-8,即:&#12345;&#12234
我想用的是中文的内容。
请问:UTF8如何转换成中文的GB?

#20


hi,
当你写文件的时候不要用writer, 应该用outPutStream. writer会自动把String 转换成系统却省的encoding. 因为你的系统是中文的,所以你看到的总是GB2312或者GBK.

#21


up

#22


iso_8859-1<- ->utf-8

#23


to hellking(信息孤岛)

你的做法是正确的,谢谢!

#1


firstChild.setAttribute("attr", new String("中文测试","ISO-8859-1");

i forgot the encode type,may be using DEFAULT and if your JDK is internation editor,or try modify ISO-8859-1 to gb2312

#2


改成
firstChild.setAttribute("attr", new String("中文测试".getBytes(),"ISO-8859-1"));
的结果:

<?xml version="1.0" encoding="UTF-8"?>
<test-root>
    <test-attribute attr="&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;"/>
</test-root>
------------------------------------
改成
firstChild.setAttribute("attr", new String("中文测试".getBytes(),"GB2312"));
的结果:

<?xml version="1.0" encoding="UTF-8"?>
<test-root>
    <test-attribute attr="中文测试"/>
</test-root>
------------------------------------

请看清我的问题:我现在能正确输出GB的中文,但是我需要的是UTF-8的!

BTW:
改成:
firstChild.setAttribute("attr", new String("中文测试".getBytes(),"UTF-8"));
的结果:

<?xml version="1.0" encoding="UTF-8"?>
<test-root>
    <test-attribute attr=""/>
</test-root>

………………

在我看来这个问题值200分的!

#3


ic,but i at hometown at netbar,not setup java and anymore,so faint

#4


原来如此,多谢了,UP!!!

#5


有没有人知道?

#6


javac -encoding UTF-8 xxx.java 试试

#7


因为直接运行上面的程序(中文是写在程序里面的GB码)会产生???????,我运行了本来的程序,结果……

所有的中文……都……还是GB的……

呜呼呀……

#8


up

#9


好变态的问题,好像无解.
不过给你一个变态解法
System.out.println(new String("中文测试".getBytes("iso_8859-1"),"utf-8"));

这是输出 ????

#10


mark

#11


to  Asprilla(dont shoot me) 

能说得详细一些?

???是不行的,一定要是正确的,可以被任何一个XML编辑器打开的UTF-8的中文……

#12


doc.setEncoding("UTF-8");这一句从何而来?

你的程序中hardcode的"中文测试"是什么编码,写到XML中自然是什么编码。因此换一个UTF-8的编辑器将你的程序中的“中文测试”换成UTF-8保存就可以了。

#13


有的Parser有doc.setEncoding("UTF-8");方法。

如果是手工的话我当然知道了,通过Java Code有没有什么办法呢?

#14


JFC似乎没有方便的转码方法,不过JDK有一个native2ascii工具可以用于转码成Latin-1 和 Unicode-encoded (\u####)字符

#15


发现The JavaTM Tutorial讲诉了转码的问题,参见:
http://java.sun.com/docs/books/tutorial/i18n/text/convertintro.html

#16


http://expert.csdn.net/Expert/topic/1388/1388190.xml?temp=.3039209

#17


xml使用 uft-8 编码,原来就是 中文的 就显示为中文,是日文就显示成日文,utf-8编码是为了统一编码才出现的,你要向别的办法了
只有你本来的字符是
"涓&#65533;&#65533;娴&#65533;&#65533;"
的时候,才能输出成这样的

#18


to All 

"涓&#65533;&#65533;娴&#65533;&#65533;"

不是我原文件的内容,这个是CSDN转码后的结果,原来的内容就是标准的乱码的UTF-8。


我问这个问题的原因是WSAD在存储XML的时候做字符转化,不知道各位有没有用过WSAD。我可以向WSAD的XML编辑器里面输入GB中文,但是只要我指定了<?xml version="1.0" encoding="UTF-8"?>这句,存储的时候这个文件中所有的GB中文都变成UTF了。

所以我觉得应该是有办法解决这个问题的,求救!

#19


我用JAXB+xml schema时当输出XML时中文全部转换成UTF-8,即:&#12345;&#12234
我想用的是中文的内容。
请问:UTF8如何转换成中文的GB?

#20


hi,
当你写文件的时候不要用writer, 应该用outPutStream. writer会自动把String 转换成系统却省的encoding. 因为你的系统是中文的,所以你看到的总是GB2312或者GBK.

#21


up

#22


iso_8859-1<- ->utf-8

#23


to hellking(信息孤岛)

你的做法是正确的,谢谢!