- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试使用 Java SAX 解析器来解析 ISO-8859-1 字符编码的 XML 文件。否则一切顺利,但是 ä 和 ö 等特殊字符让我头疼。简而言之,ContentHandler.characters(...)方法给我奇怪的字符,你甚至不能使用 char 数组来构造具有指定编码的 String。
这是两个文件中的一个完整的最小工作示例:
latin1.xml:
<?xml version='1.0' encoding='ISO-8859-1' standalone='no' ?>
<x>Motörhead</x>
该文件以上述 Latin-1 格式保存,因此 hexdump 给出:
$ hexdump -C latin1.xml
00000000 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 27 31 |<?xml version='1|
00000010 2e 30 27 20 65 6e 63 6f 64 69 6e 67 3d 27 49 53 |.0' encoding='IS|
00000020 4f 2d 38 38 35 39 2d 31 27 20 73 74 61 6e 64 61 |O-8859-1' standa|
00000030 6c 6f 6e 65 3d 27 6e 6f 27 20 3f 3e 0a 3c 78 3e |lone='no' ?>.<x>|
00000040 4d 6f 74 f6 72 68 65 61 64 3c 2f 78 3e |Mot.rhead</x>|
因此,正如您所期望的那样,“ö”是用单个字节 f6 编码的。
然后,这是以 UTF-8 格式保存的 Java 文件:
MySAXHandler.java:
import java.io.File;
import java.io.FileReader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class MySAXHandler extends DefaultHandler {
private static final String FILE = "latin1.xml"; // Edit this to point to the correct file
@Override
public void characters(char[] ch, int start, int length) {
char[] dstCharArray = new char[length];
System.arraycopy(ch, start, dstCharArray, 0, length);
String strValue = new String(dstCharArray);
System.out.println("Read: '"+strValue+"'");
assert("Motörhead".equals(strValue));
}
private XMLReader getXMLReader() {
try {
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(new MySAXHandler());
return xmlReader;
} catch (Exception ex) {
throw new RuntimeException("Epic fail.", ex);
}
}
public void go() {
try {
XMLReader reader = getXMLReader();
reader.parse(new InputSource(new FileReader(new File(FILE))));
} catch (Exception ex) {
throw new RuntimeException("The most epic fail.", ex);
}
}
public static void main(String[] args) {
MySAXHandler tester = new MySAXHandler();
tester.go();
}
}
运行该程序的结果是它输出 Read: 'Mot�rhead'
(ö 替换为“? in a box”),然后由于断言错误而崩溃。如果查看 char 数组,您会发现编码字母 ö 的 char 由三个字节组成。它们对我来说没有任何意义,因为在 UTF-8 中,ö 应该用两个字节编码。
我尝试过的
我曾尝试将字符数组转换为字符串,然后将该字符串的字节传递给另一个带有字符集编码参数的字符串构造函数。我也玩过 CharBuffers 并试图找到可能与 Locale 类一起使用的东西来解决这个问题,但我尝试的似乎没有任何效果。
最佳答案
问题是您正在使用 FileReader
来读取文件,而不是之前评论者建议的 FileInputStream。在go
方法中,取出FileReader
,替换为FileInputStream
。
public void go() {
try {
XMLReader reader = getXMLReader();
reader.parse(new InputSource(new FileInputStream(new File(FILE))));
} catch (Exception ex) {
throw new RuntimeException("The most epic fail.", ex);
}
}
按照您现在的方式,FileReader
使用默认平台编码在将字符传递给 SAX 解析器之前对其进行解码,这不是您想要的。如果您替换为 FileInputStream
,那么 XML 解析器应该正确读取具有字符集编码的处理指令,并为您处理字符集解码。
因为 FileReader 正在进行解码,所以您看到的是无效字符。如果您让 SAX 解析器处理它,它应该会顺利通过。
关于java - 如何将最初的 Latin-1 char[] 从 SAX 解析器转换为正确的 UTF-8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10451033/
我有一个使用 Sinch SDK 和 CallKit 实现的 VOIP 应用程序。一切正常,除了设备插入耳机时。在后一种情况下,当通话开始时,音频仍通过设备的主扬声器路由。如果我在通话期间拔下并重
我需要将大量复杂(20 多个属性)对象过滤成多个子列表。要创建子列表,我有一个过滤器规范列表。要求是:a) 不允许一个项目成为两个子列表的一部分,并且 b) 必须能够在处理完成后获取所有未分割的项目。
我有一个简单的 .share-toggle 切换链接。当您点击它时,Facebook 评论插件应该会显示。它最初应该被 Conceal 问题是,如果我使用 css Conceal 它,然后单击切换按钮
我正在尝试制作一个功能类似于 android 市场的图库,您可以在其中滚动(左/右)以查看免费或付费应用程序等...还可以在布局中上下滚动。 到目前为止,我只是让它加载了两个布局,它们都有一个简单的“
大家好,我是网络开发的新手,最近刚刚完成我对网络设计的第一次尝试。我偶然发现了一个我找不到解决方案的问题。在 webkit-browsers 中,我的一个 ul-lists(导航)最初呈现在错误的位置
我遇到了这个问题。我在 ISP 上使用 Umbraco CMS 启动了一个 ASP.NET 网站。(这只是一个非常基本的信息网站。没什么特别的。) 但是,当我想要访问该网站时,第一个页面加载需要很长时
在我的 iPhone 应用程序中,我使用 UITabBarController 布置了三个选项卡。第一个选项卡(在应用启动时加载)使用本地数据加载,速度非常快。 虽然第二个选项卡从网络下载 XML 文
我有这样的风格: #cytoscape-container { width: 100%; height: 100%; margin: 0 aut
我在这里看到了几篇关于 SO 的帖子,但它们在功能和结构上过于具体,而我正在寻找的是我或任何人都可以在任何地方使用的更通用的东西。 我只需要有一个按钮,单击该按钮可以在 3 类之间循环。但如果出现必须
我在 http://www.raven.dima.neoturbine.net/ 有一个网页我正在努力。顶部导航在 IE 8、Firefox 3.6 和适用于 Android 的 Dolphin 浏览
我想将主机的用户/组与 docker 机器同步,以使(开发人员)能够编辑容器内部或外部的文件。有一些这样的想法:Handling Permissions with Docker Volumes这会创建
向通知列表/栏发布推送通知时,.contentText 和 .number 最初不显示(.ticker、.icon 和 .contentTitle 显示正常)。但是,在发布另一个通知(具有不同的 ID
我实现了以下 MKMapView 方法,该方法在添加注释后运行。我在 Interface Builder 中将我的 MKMapView map (parishMap) 设置为“显示用户位置”,并且在加
我是一名优秀的程序员,十分优秀!