【发布时间】:2020-02-05 22:49:55
【问题描述】:
我正在尝试通过 xslt 转换 xml 文件,但无法找到导致解析器阻塞文件的字符。在转换过程中,我收到此错误:
myfile.xml:1: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xBC 0x29 0x20 0x69
g said premises on the West which does not encroach over one and one quarter (1
^
unable to parse myfile.xml
当我在不同的编辑器中搜索该位置时,一些编辑器理解代码并显示其呈现的字符:
over one and one quarter (1 ¼)
而其他编辑器不显示默认系统字符:
uarter (1 �)
我可以手动将文件搜索到那个位置,如果是那个字符,确定它是supposed to be¼,但我希望能够在运行转换之前找到并替换这些字符。
有没有办法确定上面的字节信息应该给予什么替换?
这是 xml 序言
<?xml version="1.0" encoding="UTF-8"?>
当我使用上面的字符串并在 java 中创建一个字符数组和字节数组时,我得到了
char : ¼ bytes -68
如果我做一个测试:
if (c == '\u00BC') {
System.out.println("matched one quarter!");
}
然后它匹配...是否有一种简单的方法可以在 java 中循环并以这种方式进行查找/替换?
查找/替换需要在 xslt 转换之前完成,因为解析错误会在启动之前阻塞进程;我认为总体问题是,识别坏字符并用十进制实体替换它们的最佳方法是什么?如上所示,一些编辑器渲染 char,另一些则抛出错误并替换为 '?'或其他一些系统字符。
我认为上面的 java char 测试似乎是迄今为止最好的解决方案。
【问题讨论】:
-
文件上的 XML 声明说明了什么?首先是如何生成文件的?有问题的部分在十六进制编辑器中是什么样子的?
-
“我希望能够在转换运行之前找到并替换这些字符。” 也许您需要做的就是更改 XML 声明。或者将文档转换为 UTF-8 编码。无论如何,这些都不能在 XSLT 中完成。
-
我尝试将 xml prolong @encoding 更改为 'iso-8859-1',xslt trans 能够在没有解析错误的情况下运行,但它导致了一堆非常标准的字符,例如打开和关闭报价作为未知数出现。查找/替换需要在 xslt 转换之前完成,但除了我展示的 java char 测试之外,我无法以任何方式识别这些字符
-
无论是替换 XML 声明还是根据声明未编码的字节,您都必须知道实际的字符编码。只有文件编写者知道它是什么。
-
能够读取文件并正确显示
¼字符的编辑器也应该能够告诉您实际编码是什么(显然,它是不是iso-8859-1)。恕我直言,您应该专注于这一点,而不是寻找“坏字符”,这些“坏字符”是由于错误的编码选择而被歪曲的完美字符。
标签: xml xslt utf-8 character-encoding