Pharo声明U + 00A0中的XMLParser是"无效的UTF-8"

时间:2016-07-28 19:52:06

标签: utf-8 smalltalk pharo

鉴于输入:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<sms body=". what" />

&#34;。&#34;之后的角色。在sms标记的body属性中是U+00A0;

我收到错误:

  

XMLEncodingException:无效的UTF-8字符编码(第2行)(第13列)

IIUC,该角色的UTF-8表示为0xC2 0xA0 per Wikipedia。果然,输入的字节72和73分别为194和160.

这似乎是XMLParser中的一个错误,或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

感谢Monty前来救援on the Pharo User's list

  

你是双重解码。使用onFileNamed:/ parseFileNamed:而不是(和   DOM printToFileNamed:写入时的消息系列)和let   XMLParser会为您解决此问题,或者之前禁用XMLParser解码   使用#decodesCharacters进行解析:。

     

更长的解释:

     

类#on:/ #parse:取一个字符串或一个流(读取   定义)。你给它一个FileReference,但因为参数是   用isString测试并发送#readStream,否则它没有爆炸   然后

     

文件引用发送#readStream返回自动执行的文件流   解码。但是XMLParser也自动尝试自己的解码,   如果:

     

输入以BOM开头,或者可以用空字节推断   在第一个非空字节之前或之后。

     

有一个非UTF-8编码的编码声明。

     

有一个UTF-8编码声明,但该流不正常   ReadStream(你的情况)。

     

因此它被解码两次,并且char的解码值导致了   错误。我会考虑改变启发式,以减少对它的渴望   解码。