如何使用 FOR XML 正确转换重音字符

How to properly convert accented characters using FOR XML

我正在尝试在 SQL 服务器中获取一个包含重音字符(特别是尖音符 e)的字符串,并在使用 FOR XML PATH 时将其正确转换如下:

SELECT 'é' AS Accent
FOR XML PATH('')

/* Produces: <Accent>&eacute;</Accent> */

但是,它总是带有重音,或者尝试转换其他字符。这是我到目前为止尝试过的:

SELECT 'é' AS Accent
FOR XML PATH('')

/* Produces: <Accent>é</Accent> */

SELECT N'é' AS Accent
FOR XML PATH('')

/* Produces: <Accent>é</Accent> */

SELECT REPLACE('é', 'é', '&eacute;') AS Accent
FOR XML PATH('')

/* Produces: <Accent>&amp;eacute;</Accent> */

SELECT '<![CDATA[' + 'é' + ']]>' AS Accent
FOR XML PATH('')

/* Produces: <Accent>&lt;![CDATA[é]]&gt;</Accent> */

SELECT CAST('<![CDATA[' + 'é' + ']]>' AS XML) AS Accent
FOR XML PATH('')

/* Produces: <Accent>é</Accent> */

我已经找了很长时间,除了将最终结果 XML 转换为字符串并手动替换字符之外找不到任何东西 - 我正在寻找更正确的方法这个。这只是 SQL 服务器中的一个错误吗?它似乎可以转换大量其他字符(<、>、& 等...)。

非常感谢您的帮助。

我正在使用 SQL Server 2008。

我不确定,但我假设,如果没有黑客,这是不可能的。

SQL-服务器在内部将 XML 视为 2 字节 utf-16。因此,在此范围内可显示的所有字符都不需要转义。

当涉及到不可打印的字符或字母时,情况就不同了,它们具有声明性含义,例如 <, > and & 或引号(在某些情况下)。

我可能会使用强制转换为 NVARCHAR(MAX),然后在导出此数据时在字符串级别进行替换。您将无法将其转换回 XML:

--将你的测试XML推入一个变量

DECLARE @xml XML=
(
    SELECT 'é' AS Accent
    FOR XML PATH('')
);
SELECT @xml; --<Accent>é</Accent>

--将其转换为字符串并在字符串级别进行替换

SELECT REPLACE(CAST(@xml AS NVARCHAR(MAX)),'é', '&eacute;') --<Accent>&eacute;</Accent>

--尝试将此结果转换回 XML 失败

SELECT CAST(REPLACE(CAST(@xml AS NVARCHAR(MAX)),'é', '&eacute;') AS XML); 

XML parsing: line 1, character 16, well formed check: undeclared entity

很明显 SQL 服务器的 XML 引擎甚至不知道这个实体...