UTF-16 XML to HTML in .NET



我在SQL Server数据库表列中存储了一个字符串,该字符串当前是VARCHAR(MAX(,但内容为UTF-16 XML。这是一个样本:

<?xml version="1.0" encoding="utf-16" standalone="yes"?><Content><control name="txtGeneral" value="Hi Bryan,&#xD;&#xA;&#xD;&#xA;This is a sample message stored in the database that I need to get out in HTML. I can&amp;amp;#39;t seem to figure out how to get it out into HTML. &#xD;&#xA;&#xD;&#xA;Thanks!&#xD;&#xA;&#xD;&#xA;Robot.&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;-----Original Message-----&#xD;&#xA;&#xD;&#xA;Date:      08-21-15 19:57&#xD;&#xA;&#xD;&#xA;From:     System Test, Microsoft Corp&#xD;&#xA;&#xD;&#xA;To:         Framework.NET&#xD;&#xA;&#xD;&#xA;Subject:  RE: RE: RE: RE:  &#xD;&#xA;&#xD;&#xA;" /></Content>

数据存储的RAW不是XML/数据类型,但我可以在选择中进行转换(请参见下文(。我通过.NET/ADO将其拉出,因此我将其本地放在弦乐中以在HTML中显示。我只需要将其转换为文本框或HTML元素,以便将其显示在屏幕上。

我可以在t-sql中解析我想要的元素(@value(,但这并不能为我做编码更改。这是我的示例查询:

SELECT TOP 1 CONVERT(XML,CONVERT(NVARCHAR(MAX),m.Content)).value('(/Content/control/@value)[1]', 'varchar(max)')
FROM Messages m
WHERE MessageID = 85713;

我可以使用.NET或T-SQL进行转换。我一次只选择一条消息,因此性能不应该是问题。

这就是我想要的样子:

Hi Bryan,
This is a sample message stored in the database that I need to get out in HTML. I can&amp;amp;#39;t seem to figure out how to get it out into HTML. 
Thanks!
Robot.

-----Original Message-----
Date:      08-21-15 19:57
From:     System Test, Microsoft Corp
To:         Framework.NET
Subject:  RE: RE: RE: RE:  

通过:https://r12a.github.io/apps/conversion/

谢谢!

有许多严重缺陷:

  • 请勿将XML存储在字符串基础上,请使用本机XML类型
  • 不要将XML作为字符串处理,请使用本机XML方法
  • 如果 - 出于任何原因 - 您必须在字符串级别上处理 NVARCHAR(MAX)
  • 切勿使用1字节编码的VARCHAR(MAX)。这将忽略额外的转换并可能导致愚蠢的错误。
  • 请勿存储XML销售<?xml blah ?>。这是指定文件编码所需的。在sql-server中,xml是始终Unicode/ucs 2

如果您可以更改上述内容,则应真正考虑这样做。如果没有,这是一种方法:

首先将VARCHAR(MAX)施加到NVARCHAR(MAX),然后将其施放为XML。与NVARCHAR(MAX)一起,UTF-16将不再打扰。然后使用.value()检索SO命名属性的值。

DECLARE @mockMessages TABLE(Content VARCHAR(MAX));
INSERT INTO @mockMessages VALUES
('<?xml version="1.0" encoding="utf-16" standalone="yes"?><Content><control name="txtGeneral" value="Hi Bryan,&#xD;&#xA;&#xD;&#xA;This is a sample message stored in the database that I need to get out in HTML. I can&amp;amp;#39;t seem to figure out how to get it out into HTML. &#xD;&#xA;&#xD;&#xA;Thanks!&#xD;&#xA;&#xD;&#xA;Robot.&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;-----Original Message-----&#xD;&#xA;&#xD;&#xA;Date:      08-21-15 19:57&#xD;&#xA;&#xD;&#xA;From:     System Test, Microsoft Corp&#xD;&#xA;&#xD;&#xA;To:         Framework.NET&#xD;&#xA;&#xD;&#xA;Subject:  RE: RE: RE: RE:  &#xD;&#xA;&#xD;&#xA;" /></Content>');
SELECT CAST(CAST(m.Content AS NVARCHAR(MAX)) AS XML).value(N'(/Content/control/@value)[1]',N'nvarchar(max)') 
FROM @mockMessages AS m;

同样的 - 原理 - 对.Net有效。

更新:有关编码

的一些单词

sql-server既不支持UTF-8,也不支持 real utf-16。有一个1个字节编码,它是扩展的ascii (codepage/conture映射(和一个2字节编码,它是unicode/ucs-2(至少是UTF-8,至少是使用UTF-8通常看到的字符中有99%(。如果您需要输出UTF-8编码,则必须在应用程序中执行此操作。在几乎任何情况下,您都将SQL Server的XML输出(在UCS-2中(视为UTF-16。默认情况下,SQL-Server和.NET-CODE之间的通信是Unicode

最新更新