金蝶 s-HR Cloud webservice接口异常:SAXParseException:字符引用 "&"原创
金蝶云社区-liheng_li
liheng_li
2人赞赏了该文章 367次浏览 未经作者许可,禁止转载编辑于2023年07月05日 13:33:00

问题描述:

       单点登录调用OSF接口:使用webservice方式调用接口返回:{ "error": "Call OSF error: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 4450419; 字符引用 "�"}

        

 image.png

环境信息:        

        数据库:oracle库 数据库字符编码集:varchar(AL32UTF-8) nvarchar(AL16UTF-16);此两种编码集可正常显示生僻字。

问题原因:

      webservice接口通过SOAP(Simple Object Access Protocol)传输方式进行数据传输。 

      SOAP是一种基于XML的通信协议,它定义了在Web服务之间进行信息交换的规范。SOAP消息是以XML格式进行封装的,消息头包含有关消息的元数据,消息体包含实际的数据。在Java中,你可以使用JAX-WS(Java API for XML Web Services)来创建和访问SOAP Web服务。JAX-WS提供了用于生成和解析SOAP消息的API,可以轻松地创建SOAP客户端和服务端。 

     1.由于基于XML格式传输 :生僻字字符没有正确的通过Unicode码表示。

       在 XML 中,实际上,� 是一个十六进制的字符引用(Character Reference),表示 Unicode 编码中的一个字符。具体来说,� 对应的 Unicode 编码是 U+D844。

然而,根据我的知识库中的信息(截止到2021年9月),Unicode 编码 U+D844 并没有对应的字符,也就是说,它不代表任何生僻字或其他字符。在 Unicode 中,并不是每个编码都有对应的字符,有些编码留空或者为未定义的编码。

因此,� 并不代表任何生僻字,而是一个无效的字符引用。如果你遇到了类似的字符引用,很可能是由于数据或文本中出现了错误的编码导致的。在处理字符引用时,应确保使用正确的编码来表示相应的字符。

。请注意,如果只有高位代理而没有低位代理,或者只有低位代理而没有高位代理,都是不合法的代理对,会导致 XML 解析错误。

     2.可以在oracle中通过sql查找哪些数据包含生僻字:

SELECT *
FROM your_table
WHERE your_column LIKE '%' || UNISTR('\D861\DEAC') || '%';
UNISTR('\D861\DEAC') 表示 Unicode 转义序列,可根据异常抛出的unicode字符模糊查询

或者通过httpClient方式拿到osf数据:
在数据中搜索�。这个符号标识字符无效引用

 问题结论:webservice不支持无效引用的生僻字(某些生僻字)的数据传输,若需要传输生僻字,请使用httpclient接口,或者修改生僻字

赞 2