- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安XML教程基地 来源:黑客防线网安XML教程基地 浏览次数:0 |
XML 根据 Unicode 字符进行定义。在现代计算机的传输和存储过程中,那些 Unicode 字符必须按字节存储,通过解析器进行解码。很多编码方案可实现此目的:UTF-8、 UTF-16、ISO-8859-1、Cp1252 和 SJIS 等。
通常情况下,但不一定总是这样,您实际上不关注基本编码。XML 解析器对任何写入到 Unicode 字符串和字符数组中的文档进行转换。程序对解码后的字符串进行操作。本文讨论真正关注基本编码的 “不常出现” 的情况。
最常见的情况是想为输出结果保存输入编码。
另外一种情况是,不用解析文档,而将其作为字符串或字符大对象(Character Large Object, CLOB)存储在数据库中。
类似地,有些系统通过 HTTP 传输 XML 文档时,并没有全部读取文档,但需要设置 HTTP 的 Content-type 报头,指定正确的编码。在这种情况下,您需要知道文档是如何编码的。
大多数情况下,对于您编写的文档,您知道如何编码。但是,如果不是您编写的文档 — 只是从其他地方接收的文档(例如,从一个 Atom 提要中)— 那么最好的方法是使用一个 streaming API,例如 Simple API for XML(SAX)、Streaming API for XML(StAX)、System.Xml.XmlReader 或 Xerces Native Interface(XNI)。另外,也可以使用树型 API,例如文档对象模型(Document Object Model,DOM)。但是,它们需要读取整个文档,即使通常只需读取前 100 个字节(或更少)来判断编码。streaming API 可以只读取需要的内容,一旦得到结果后,就不再解析。这样就会更有效率。
SAX
目前,大多数 SAX 解析器,包括与 Sun 公司的 Java™ 软件开发套件(JDK)6 绑定的 SAX 解析器,可以用来检测编码。该技术不难实现,但是也不易理解。可以简单地概括为:
在 setDocumentLocator 方法中,将 Locator 参数传递给 Locator2。
在字段中保存 Locator2 对象。
在 startDocument 方法中,调用 Locator2 字段的 getEncoding() 方法。
(可选)如果已得到想要的全部结果,那么可以抛出 SAXException 提前结束解析过程。
清单 1 通过一个简单的程序说明该技术,输出命令行中给定的所有 URL 的编码。
清单 1. 使用 SAX 确定文档的编码
import org.xml.sax.*;
import org.xml.sax.ext.*;
import org.xml.sax.helpers.*;
import java.io.IOException;
public class SAXEncodingDetector extends DefaultHandler {
public static void main(String[] args) throws SAXException, IOException {
XMLReader parser = XMLReaderFactory.createXMLReader();
SAXEncodingDetector handler = new SAXEncodingDetector();
parser.setContentHandler(handler);
for (int i = 0; i < args.length; i++) {
try {
parser.parse(args[i]);
}
catch (SAXException ex) {
System.out.println(handler.encoding);
}
}
}
private String encoding;
private Locator2 locator;
_cnnew1@Override
public void setDocumentLocator(Locator locator) {
if (locator instanceof Locator2) {
this.locator = (Locator2) locator;
}
else {
this.encoding = "unknown";
}
}
@Override
public void startDocument() throws SAXException {
if (locator != null) {
this.encoding = locator.getEncoding();
}
throw new SAXException("Early termination");
}
}
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |