sql-server - 如何正确处理 UTF-8 XML 中的 ?

标签 sql-server xml unicode encoding utf-8

我在表示 ￿ 时遇到一些问题,这是一个有效的 UTF-16 构造,并且在 Windows 文件名中、在 XML 中显然也有效,以便在 SQL Server XML (2012) 中使用。

以此为例:

DECLARE @Xml xml;
SET @Xml = N'<?xml version="1.0"?><FileName>풜〣&#xFFFF;&#xFFFF;</FileName>'

-- Result: XML parsing: line 1, character 41, illegal xml character

但是,这是合法的 Unicode(“Unicode 非字符”''):http://www.fileformat.info/info/unicode/char/ffff/index.htm

所以,我尝试了这个:

DECLARE @Xml xml;
SET @Xml = N'<?xml version="1.0" encoding="utf-16"?><FileName>풜〣&#xFFFF;&#xFFFF;</FileName>'

-- Result: XML parsing: line 1, character 59, illegal xml character

那么 - 我应该如何在 XML 中准确地表示这个文件名?我不能只删除这些字符,它们确实是 Get-ChildItem 报告的 ￿ 字符,并且我需要保留此文件的句柄。

我可以通过将 ￿ 替换为 ï¿¿(即 UTF-8)来进行 XML 解析。根据 this link 表示 \uFFFF然后,我尝试获取此 XML 并将其插入到 nvarchar 列中,我需要它作为文件名的正确表示形式。

DECLARE @Xml xml;
SET @Xml = N'<?xml version="1.0"?><FileName>풜〣&#xEF;&#xBF;&#xBF;&#xEF;&#xBF;&#xBF;</FileName>'
SELECT F.Item.value('.', 'nvarchar(2000)') FROM @Xml.nodes('//FileName') as F(Item)

-- Returns 풜〣ï¿¿ï¿¿ (not correct)

最佳答案

XML 文档中允许的字符集由production 2 定义。 XML 规范。它不包括 U+FFFF(它被 Unicode 定义为非字符,并且在开发 XML 时不允许使用 Unicode 进行信息交换)。

这意味着您不能在 XML 文档中按字面意思表示 U+FFFF,也不能使用 XML 数字字符引用。当然,您可以发明自己的转义机制,或者使用 URI 转义之类的方法来对数据中的字符进行编码;在将数据插入允许 U+FFFF 的应用程序之前,您当然必须取消转义您的表示形式。

我想知道为什么 Windows 文件名中允许使用非字符。

关于sql-server - 如何正确处理 UTF-8 XML 中的 ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29022169/

相关文章:

sql - 选择嵌套 JSON 数组包含特定值的行

xml - xsd :all 之后的重复元素

java - 使用另一个 Activity 调用 xml 元素(android)

c++ - 如何让 C++ wfstream 与 Unicode 文件路径一起使用?

c++ - c32rtomb 转换成什么编码?

c# - 为什么不在 finally block 中关闭数据库连接

sql-server - SQL Server 添加列

sql - 如何在标签中生成带有非法字符的xml

javascript - 在 Django 中发送字符串元素列表

sql-server - 这些 sys.sp_* 存储过程在做什么?