BaseX解析含扩展Unicode字符的HTML乱码如何解决?
问题原因
该问题并非解析环节丢失字符,本质是BaseX默认序列化输出的编码配置不支持Unicode辅助平面字符,测试用的数学希腊字母属于超出BMP的扩展字符,默认输出编码无法识别就被替换为了问号,底层依赖的TagSoup实际已经完成了正确解析。
解决方案
方案1:全局指定序列化编码(最简便)
在XQuery查询开头添加编码声明即可直接解决,修改后的测试代码如下:
declare option output:encoding 'utf-8'; let $htmlRaw := '<span class="eqn">𝞪 + 𝞫 = 𝞬</span>' let $htmlParsed := html:parse($htmlRaw, map { 'encoding': 'utf-8'}) return ( 'INPUT', $htmlRaw, 'OUTPUT', $htmlParsed )
方案2:单结果指定序列化规则
如果不想修改全局查询配置,可以仅在输出解析结果时调用serialize()函数手动指定编码,示例如下:
let $htmlRaw := '<span class="eqn">𝞪 + 𝞫 = 𝞬</span>' let $htmlParsed := html:parse($htmlRaw, map { 'encoding': 'utf-8'}) return ( 'INPUT', $htmlRaw, 'OUTPUT', serialize($htmlParsed, map { 'encoding': 'utf-8', 'method': 'html' }) )
方案3:源码层面透传TagSoup参数
如果需要从解析环节控制编码,可以修改BaseX的HTML模块源码,在调用TagSoup解析器时增加output-encoding参数的透传逻辑,后续调用html:parse()时直接传入该参数即可生效。
内容的提问来源于stack exchange,提问作者Sandeep S
相关产品推荐
相关产品推荐

