在 Java 中读取以 UTF16 编码的 XML 文件
Reading XML file encoded in UTF16 in Java
我正在尝试使用 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 和 Run/Debug 设置 window 中时,在最后一个名为 'Common' 的选项卡中,所选编码是默认 - 继承 (Cp1253 ), 我得到的输出是错误的:
FILE_NAME: ????????_???????? ??????.pdf
当同一个选项卡中选择的编码为UTF-8时,输出正常:
FILE_NAME: Выписка_Винтовые насосы.pdf
我做错了什么?
如何在 eclipse 项目设置中使用默认编码 (cp 1253) 获得正确的输出?
此代码在我不想更改虚拟机默认编码的服务器中运行。
我已经用 Java 7 和 Java 8
测试了这段代码
尝试在输入流中明确设置编码:
Document doc = dBuilder.parse(new InputStreamReader(new FileInputStream(fXmlFile), "UTF-16"));
How can I get the correct output with the default encoding (cp 1253) in eclipse project settings?
你不能。要查看正确的输出,控制台必须知道要显示的字符。
This code runs in a server where I don't want to change the default encoding of the virtual machine.
您可以编写一个 UTF-8/16 日志文件,您可以在其中使用 cat 从另一个控制台或文本编辑器查看输出。
if (nNode.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) nNode;
String message = "FILE_NAME: " + eElement.getElementsByTagName("FILE_NAME").item(0).getTextContent();
System.out.println(message);
// output FILE_NAME to logfile.txt (quick and dirty)
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File("logfile.txt")), "UTF-8");
writer.write(message);
writer.close();
}
我 运行 此代码在 运行 配置中使用 ISO-8859-1 编码。
Eclipse 输出:FILE_NAME:????????_?????????? ??????.pdf
日志文件输出:FILE_NAME:Выписка_Винтовыенасосы.pdf
问题与XML本身无关。 Java 字符串是 UTF-16 编码的,Document
正确地将 XML 数据解码为 UTF-16 字符串。真正的问题是,您将 Eclipse 设置为使用 cp1253
(Windows-1253 希腊语,与 ISO-8859-7 希腊语略有不同)作为其控制台字符集,但大多数 Unicode 字符您正在尝试输出(俄语)根本不存在于该字符集中,因此它们被替换为 ?
。这也解释了为什么当控制台字符集设置为 UTF-8 时输出是正确的,因为 UTF8<->UTF16 转换是无损的。
我正在使用旧的 dom4j 库来解析 xml,这就是导致问题的原因。
使用 JVM 1.7 嵌入式库解决了问题:
import java.io.File;
import java.io.StringReader;
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;
import org.xml.sax.InputSource;
public XMLDoc()
{
try
{
File xmlFile = new File("C:\my_file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
NodeList nList = _doc.getElementsByTagName("row");
for (int i = 0; i < nList.getLength(); i++)
{
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) nNode;
Node itemNode = eElement.getElementsByTagName("FILE_NAME").item(0);
String text = itemNode != null ? itemNode.getTextContent() : "";
// russian text is fine here
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
我正在尝试使用 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 和 Run/Debug 设置 window 中时,在最后一个名为 'Common' 的选项卡中,所选编码是默认 - 继承 (Cp1253 ), 我得到的输出是错误的:
FILE_NAME: ????????_???????? ??????.pdf
当同一个选项卡中选择的编码为UTF-8时,输出正常:
FILE_NAME: Выписка_Винтовые насосы.pdf
我做错了什么?
如何在 eclipse 项目设置中使用默认编码 (cp 1253) 获得正确的输出?
此代码在我不想更改虚拟机默认编码的服务器中运行。
我已经用 Java 7 和 Java 8
测试了这段代码尝试在输入流中明确设置编码:
Document doc = dBuilder.parse(new InputStreamReader(new FileInputStream(fXmlFile), "UTF-16"));
How can I get the correct output with the default encoding (cp 1253) in eclipse project settings?
你不能。要查看正确的输出,控制台必须知道要显示的字符。
This code runs in a server where I don't want to change the default encoding of the virtual machine.
您可以编写一个 UTF-8/16 日志文件,您可以在其中使用 cat 从另一个控制台或文本编辑器查看输出。
if (nNode.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) nNode;
String message = "FILE_NAME: " + eElement.getElementsByTagName("FILE_NAME").item(0).getTextContent();
System.out.println(message);
// output FILE_NAME to logfile.txt (quick and dirty)
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File("logfile.txt")), "UTF-8");
writer.write(message);
writer.close();
}
我 运行 此代码在 运行 配置中使用 ISO-8859-1 编码。
Eclipse 输出:FILE_NAME:????????_?????????? ??????.pdf
日志文件输出:FILE_NAME:Выписка_Винтовыенасосы.pdf
问题与XML本身无关。 Java 字符串是 UTF-16 编码的,Document
正确地将 XML 数据解码为 UTF-16 字符串。真正的问题是,您将 Eclipse 设置为使用 cp1253
(Windows-1253 希腊语,与 ISO-8859-7 希腊语略有不同)作为其控制台字符集,但大多数 Unicode 字符您正在尝试输出(俄语)根本不存在于该字符集中,因此它们被替换为 ?
。这也解释了为什么当控制台字符集设置为 UTF-8 时输出是正确的,因为 UTF8<->UTF16 转换是无损的。
我正在使用旧的 dom4j 库来解析 xml,这就是导致问题的原因。 使用 JVM 1.7 嵌入式库解决了问题:
import java.io.File;
import java.io.StringReader;
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;
import org.xml.sax.InputSource;
public XMLDoc()
{
try
{
File xmlFile = new File("C:\my_file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
NodeList nList = _doc.getElementsByTagName("row");
for (int i = 0; i < nList.getLength(); i++)
{
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) nNode;
Node itemNode = eElement.getElementsByTagName("FILE_NAME").item(0);
String text = itemNode != null ? itemNode.getTextContent() : "";
// russian text is fine here
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}