如何处理时,一些特殊的UTF-8字符是在MATLAB一个XML文件中(How to handle w

2019-10-18 13:25发布

我有几个XML文件进行处理。 下面的示例给出文件

  <DOC>
  <DOCNO>2431.eng</DOCNO>
  <TITLE>The Hot Springs of Baños del Inca near Cajamarca</TITLE>
  <DESCRIPTION>view of several pools with steaming water; people, houses and 
   trees behind it, and a mountain range in the distant background;</DESCRIPTION>
   <NOTES>Until 1532 the place was called Pulltumarca, before it was renamed to
   "Baños  del Inca" (baths of the Inka) with the arrival of the Spaniards . 
   Today, Baños del Inca is the most-visited therapeutic bath of Peru.</NOTES>
   <LOCATION>Cajamarca, Peru</LOCATION>
   </DOC>        

当使用xmlread()MATLAB函数我碰到下面的错误。

    [Fatal Error] 2431.eng:3:29: Invalid byte 2 of 4-byte UTF-8 sequence.
    ??? Java exception occurred:
    org.xml.sax.SAXParseException: Invalid byte 2 of 4-byte UTF-8 sequence.
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)

    Error in ==> xmlread at 98
    parseResult = p.parse(fileName);

如何解决这个问题有什么建议?

Answer 1:

您发布的抽样工作得很好。

由于错误消息指出,我认为你的实际文件编码不正确。 记住,不是所有可能的字节序列是合法的UTF-8序列: http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences

一个快速的方法来检查是在Firefox中打开该文件。 如果XML文件具有编码的问题,你会看到如下的错误信息:

XML解析错误:没有很好地形成


编辑:

于是我带着一看文件 :你的问题是,XML解析器处理文件,而<?xml ... ?>报关行为UTF-8,但你的文件看起来编码为ISO-8859-1 (拉丁1 )或Windows的1252 (CP-1252)来代替。

例如,SAX解析器哽咽以下令牌: Baños 。 此字符“与波浪Ñ字母”,它是U + 00F1 ,具有在两个不同的编码表示:

  • 在ISO-8859-1,它被表示为一个字节:的0xf1
  • 在UTF-8,它被表示为两个字节:0xC3 0xB1

而UTF-8被设计为具有向后兼容性ASCII的字符ñ落入扩展ASCII范围,它们都表示为UTF-8的两个或多个字节。

因此,当子ño存储在拉丁语-1作为11110001 01101111将被解析为UTF-8编码,解析器看到的第一个字节和识别它作为以下形式的4个字节的UTF-8序列的开始11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 。 但是,因为它显然不遵循该格式,抛出一个错误:

org.xml.sax.SAXParseException:4字节UTF-8序列的无效字节2。

底线是: 坚持使用XML声明 ! 在你的情况下,所有的文件的开头添加以下行:

<?xml version="1.0" encoding="ISO-8859-1"?>

或者更好的是,修改生成这些文件写说行程序。

这一变化后,MATLAB(或真正的Java)应该能够正确读取XML文件:

>> doc = xmlread('2431.eng');
>> doc.saveXML([])
ans =
<?xml version="1.0" encoding="UTF-16"?>
<DOC>
<DOCNO>annotations/02/2431.eng</DOCNO>
<TITLE>The Hot Springs of Baños del Inca near Cajamarca</TITLE>
<DESCRIPTION>view of several pools with steaming water; people, houses and trees behind it, and a mountain range in the distant background;</DESCRIPTION>
<NOTES>Until 1532 the place was called Pulltumarca, before it was renamed to "Baños del Inca" (baths of the Inka) with the arrival of the Spaniards . Today, Baños del Inca is the most-visited therapeutic bath of Peru.</NOTES>
<LOCATION>Cajamarca, Peru</LOCATION>
<DATE>October 2002</DATE>
<IMAGE>images/02/2431.jpg</IMAGE>
<THUMBNAIL>thumbnails/02/2431.jpg</THUMBNAIL>
</DOC>

(注:显然,一旦MATLAB读取文件,它在内部重新编码作为UTF-16)



文章来源: How to handle when some special UTF-8 characters are inside a XML file in matlab