【问题标题】:xml : unable to track down invalid charxml:无法追踪无效字符
【发布时间】: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


【解决方案1】:

从表面上看“输入不是正确的 UTF-8”,而“¼”在 UTF-8 中是 0xC2 0xBC, 并采取“指示编码!”从表面上看,我会说您应该返回文件或规范或其他信息的来源,并告诉您的 XSLT 处理器文件的字符编码。

好的,既然您已显示 XML 声明为 UTF-8,那么您的文件无效。没有 XSLT 处理器有义务处理它。发回给发起人。

【讨论】:

  • 很抱歉没有提供更清晰的说明...请查看进一步的编辑。谢谢!
猜你喜欢
  • 2021-02-06
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多