【发布时间】:2015-06-18 14:37:39
【问题描述】:
我正在尝试使用 Java 读取 UTF-16 xml 文件。 该文件是用 C# 编写的。
这是java代码:
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLReadTest
{
public static void main(String[] s)
{
try
{
File fXmlFile = new File("C:\\my_file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("row");
for (int temp = 0; temp < nList.getLength(); temp++)
{
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) nNode;
System.out.println("FILE_NAME: " + eElement.getElementsByTagName("FILE_NAME").item(0).getTextContent());
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
这是 xml 文件:
<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<docMetadata>
<row>
<FILE_NAME>Выписка_Винтовые насосы.pdf</FILE_NAME>
<FILE_CAT>GENERAL</FILE_CAT>
</row>
</docMetadata>
在 Eclipse 和“运行/调试”设置窗口中运行此代码时,在名为“Common”的最后一个选项卡中,选择的编码是 Default - Inherited (Cp1253),我得到的输出是错误的:
FILE_NAME: ???????_?????????? ??????.pdf
当同一选项卡中选择的编码为 UTF-8 时,输出正常:
文件名:Выписка_Винтовые насосы.pdf
我做错了什么?
如何在 Eclipse 项目设置中使用默认编码 (cp 1253) 获得正确的输出?
此代码在我不想更改虚拟机默认编码的服务器中运行。
我已经用 Java 7 和 Java 8 测试过这段代码
【问题讨论】:
-
您确定字符串的内容不同,而不仅仅是控制台输出有问题吗?如果您的默认编码不能代表您尝试输出的字符,那么它将无法正常工作...
-
不仅仅是控制台输出。调试器中的字符串值也显示为“?????????.pdf”。下面的 Remy Lebeau 和 user3141592 解释了为什么它在我的 Eclipse 中不起作用。但是,如果我们将 eclipse 放在一边,如何在 Windows Server 中使用 .exe 文件执行的程序中解决这个问题?我需要更改代码中的某些内容,还是 Windows 设置中的某些内容?
-
老实说,我很惊讶它不起作用。您能否将示例文件放到网络上,以便我们验证编码是否正确?
-
这是文件:drive.google.com/file/d/0B86OsnzLlycjQm5RTHBUbXMyUnM/… 使用 Notepad++ 打开文件显示“UCS-2 Big Endian” 在实际程序执行场景中,xml 是从 C# Web 服务生成为字符串的,如下所示: XElement doc = new XElement("docMetadata"); // 将数据添加到我的 xml,然后: XDocument xmlInUtf16 = new XDocument(new XDeclaration("1.0", "UTF-16", "yes"), doc); StringWriter sr = new StringWriter(); xmlInUtf16.Save(sr);字符串 xmlStr = sr.ToString(); return xmlStr 下面续...
-
然后Java把这个String放到DocumentBuilder中进行解析。在 eclipse 调试器中,当我查看 xml 字符串时,文件名在俄语中看起来不错。但是当我从文档构建器中提取它的值时,它在 Eclipse 中显示为 ???????.pdf(使用 Cp1253 时)。在 Eclipse 中使用 UTF-8 时结果正常。当我的程序在生产中运行时出现错误。