简体   繁体   English

在 SQL Server 中将 XML UTF-8 编码的字符串转换为 XML 数据类型

[英]Convert an XML UTF-8 encoded string to XML datatype in SQL Server

Converting an XML string using CAST( AS XML) works as expected in many scenarios, but fail with an error "illegal xml character" if the string contains accented chars.使用 CAST(AS XML) 转换 XML 字符串在许多情况下都按预期工作,但如果字符串包含重音字符,则会失败并显示错误“非法 xml 字符”。

This example fails with error "XML parsing: line 2, character 8, illegal xml character":此示例因错误“XML 解析:第 2 行,字符 8,非法 xml 字符”而失败:

declare @Text VARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-8"?>
<ROOT>níveis porém alocação</ROOT>'

select CAST(@Text AS XML)

According to XML Specification all of them are legal XML chars, but replacing accented chars with an 'X' char will result in a sucessfull CAST:根据XML 规范,它们都是合法的 XML 字符,但是用“X”字符替换重音字符将导致成功的 CAST:

declare @MessageText VARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-8"?>
<ROOT>nXveis porXm alocaXXo</ROOT>'

select CAST(@MessageText AS XML)

Result: <ROOT>nXveis porXm alocaXXo</ROOT>结果: <ROOT>nXveis porXm alocaXXo</ROOT>

Moreover, the same XML but UTF-16 encoded, inexplicably works:此外,相同的 XML 但 UTF-16 编码,莫名其妙地工作:

declare @MessageText NVARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-16"?>
<ROOT>níveis porém alocação</ROOT>'

select CAST(@MessageText AS XML)

Result: <ROOT>níveis porém alocação</ROOT>结果: <ROOT>níveis porém alocação</ROOT>

Are those chars illegal in UTF-8?这些字符在 UTF-8 中是非法的吗? Or there is a better way to convert into an XML datatype?或者有更好的方法来转换成 XML 数据类型吗?

SQL Server strips any XML Declaration prolog internally for XML data type and uses UTF-16 encoding. SQL Server 在内部去除 XML 数据类型的任何 XML 声明序言并使用 UTF-16 编码。 Here is how to handle correctly your use case.以下是如何正确处理您的用例。

SQL数据库

-- Method #1
DECLARE @Text NVARCHAR(MAX) = N'<ROOT>níveis porém alocação</ROOT>';
SELECT CAST(@Text AS XML);

-- Method #2
DECLARE @MessageText NVARCHAR(MAX) = 
'<?xml version="1.0" encoding="UTF-16"?>
<ROOT>níveis porém alocação</ROOT>';

SELECT CAST(@MessageText AS XML);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM