【问题标题】:UTF-16 XML to HTML in .NET.NET 中的 UTF-16 XML 到 HTML
【发布时间】:2018-07-30 03:49:12
【问题描述】:

我有一个存储在 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>

存储的原始数据不是 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/

谢谢!

【问题讨论】:

  • 文本有html特殊字符所以使用System.Net.WebUtility.HtmlDecode(string);和 System.Net.WebUtility.HtmlEncode(string);
  • XML 声明是虚假的,但您似乎在查询中找到了解决方法。它应该匹配(并且内容也应该匹配)列排序规则。如果正在写入的内容包含列排序规则不支持的字符,则编写器可能会遇到问题(如替换字符、丢弃的字符或异常)。也许需要一份错误报告。

标签: c# .net sql-server xml utf-16


【解决方案1】:

有很多严重的缺陷:

  • 不要基于字符串存储 XML,使用原生 XML 类型
  • 不要将 XML 作为字符串处理,使用原生 XML 方法
  • 如果 - 出于任何原因 - 您必须在字符串级别处理它,请使用 NVARCHAR(MAX)
  • 切勿使用 1 字节编码的VARCHAR(MAX)。这将导致额外的转换,并可能导致愚蠢的错误。
  • 不要存储 xml 声明 &lt;?xml blah ?&gt;。这是指定文件的编码所必需的。在 SQL-Server 中,XML 总是 unicode / UCS 2

如果您可以更改上述内容,则您应该考虑这样做。如果没有,这里有一个方法:

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

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(代码页/字符映射)和一种2字节编码,即unicode/UCS-2(几乎是UTF-8,至少与99% 的常见字符)。如果您需要对输出进行 UTF-8 编码,则必须在应用程序中执行此操作。几乎在任何情况下,您都将 SQL Server 的 XML 输出(在 UCS-2 中)视为 UTF-16。 SQL-Server 和 .Net-code 之间的通信默认是 unicode 的

【讨论】:

猜你喜欢
  • 2011-01-07
  • 2021-07-01
  • 2012-08-18
  • 2021-01-06
  • 2021-07-29
  • 2015-09-19
  • 2017-06-27
  • 2011-07-03
  • 2020-01-29
相关资源
最近更新 更多