首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >T-SQL中的HTML编码?

T-SQL中的HTML编码?
EN

Stack Overflow用户
提问于 2009-03-12 16:18:08
回答 9查看 57.2K关注 0票数 19

在T-SQL中有没有编码HTML字符串的函数?我有一个包含诸如'<','>‘等不可靠字符的遗留数据库。我可以写一个函数来替换这些字符,但是有没有更好的方法呢?

我有一个ASP.Net应用程序,当它返回一个字符串时,它包含导致错误的字符。ASP.Net应用程序正在从数据库表中读取数据。它不会写入表本身。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-09-25 10:33:53

我们有一个遗留系统,它在输入表时使用触发器和dbmail发送HTML编码的电子邮件,因此我们需要在电子邮件生成过程中进行编码。我注意到Leo的版本有一个编码&的小bug,在&lt;&gt;中我使用这个版本:

代码语言:javascript
复制
CREATE FUNCTION HtmlEncode
(
    @UnEncoded as varchar(500)
)
RETURNS varchar(500)
AS
BEGIN
  DECLARE @Encoded as varchar(500)

  --order is important here. Replace the amp first, then the lt and gt. 
  --otherwise the &lt will become &amp;lt; 
  SELECT @Encoded = 
  Replace(
    Replace(
      Replace(@UnEncoded,'&','&amp;'),
    '<', '&lt;'),
  '>', '&gt;')

  RETURN @Encoded
END
GO
票数 27
EN

Stack Overflow用户

发布于 2013-01-09 20:00:22

现在有点晚了,但不管怎样,下面是正确的方法:

HTML编码(HTML编码= XML编码):

代码语言:javascript
复制
DECLARE @s NVARCHAR(100)
SET @s = '<html>unsafe & safe Utf8CharsDon''tGetEncoded ÄöÜ - "Conex"<html>'
SELECT (SELECT @s FOR XML PATH(''))

查询中的HTML编码:

代码语言:javascript
复制
SELECT 
    FIELD_NAME  
    ,(SELECT FIELD_NAME AS [text()] FOR XML PATH('')) AS FIELD_NAME_HtmlENcoded 
FROM TABLE_NAME

HTML-解码:

代码语言:javascript
复制
SELECT CAST('<root>' + '&lt;root&gt;Test&amp;123' + '</root>' AS XML).value(N'(root)[1]', N'varchar(max)');

如果要正确执行此操作,可以使用CLR存储过程。

然而,它变得有点复杂,因为您不能在CLR存储过程中使用System.Web-Assembly (所以您不能执行System.Web.HttpUtility.HtmlDecode(htmlEncodedStr);).因此,您必须编写自己的HttpUtility类,我不推荐这样做,尤其是在解码时。

幸运的是,您可以从单声道源代码(Linux的.NET)中分离出System.Web.HttpUtility。然后,您可以在不引用system.web的情况下使用HttpUtility。

然后编写这个CLR存储过程:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
//using Microsoft.SqlServer.Types;


namespace ClrFunctionsLibrary
{


    public class Test
    {


        [Microsoft.SqlServer.Server.SqlFunction]
        public static SqlString HtmlEncode(SqlString sqlstrTextThatNeedsEncoding)
        {
            string strHtmlEncoded = System.Web.HttpUtility.HtmlEncode(sqlstrTextThatNeedsEncoding.Value);
            SqlString sqlstrReturnValue = new SqlString(strHtmlEncoded);

            return sqlstrReturnValue;
        }


        [Microsoft.SqlServer.Server.SqlFunction]
        public static SqlString HtmlDecode(SqlString sqlstrHtmlEncodedText)
        {
            string strHtmlDecoded = System.Web.HttpUtility.HtmlDecode(sqlstrHtmlEncodedText.Value);
            SqlString sqlstrReturnValue = new SqlString(strHtmlDecoded);

            return sqlstrReturnValue;
        }


        // ClrFunctionsLibrary.Test.GetPassword
        //[Microsoft.SqlServer.Server.SqlFunction]
        //public static SqlString GetPassword(SqlString sqlstrEncryptedPassword)
        //{
        //    string strDecryptedPassword = libPortalSecurity.AperturePortal.DecryptPassword(sqlstrEncryptedPassword.Value);
        //    SqlString sqlstrReturnValue = new SqlString(sqlstrEncryptedPassword.Value + "hello");

        //    return sqlstrReturnValue;
        //}

        public const double SALES_TAX = .086;

        // http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx
        [SqlFunction()]
        public static SqlDouble addTax(SqlDouble originalAmount)
        {
            SqlDouble taxAmount = originalAmount * SALES_TAX;

            return originalAmount + taxAmount;
        }


    } // End Class Test


} // End Namespace ClrFunctionsLibrary

并注册它:

代码语言:javascript
复制
GO

/*
--http://stackoverflow.com/questions/72281/error-running-clr-stored-proc
-- For unsafe permission
EXEC sp_changedbowner 'sa'
ALTER DATABASE YOUR_DB_NAME SET TRUSTWORTHY ON 

GO
*/


IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[HtmlEncode]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[HtmlEncode]
GO


IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[HtmlDecode]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[HtmlDecode]
GO




IF  EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'ClrFunctionsLibrary' and is_user_defined = 1)
DROP ASSEMBLY [ClrFunctionsLibrary]

GO


--http://msdn.microsoft.com/en-us/library/ms345101.aspx



CREATE ASSEMBLY [ClrFunctionsLibrary]
AUTHORIZATION [dbo]
FROM 'D:\username\documents\visual studio 2010\Projects\ClrFunctionsLibrary\ClrFunctionsLibrary\bin\Debug\ClrFunctionsLibrary.dll' 
WITH PERMISSION_SET = UNSAFE  --EXTERNAL_ACCESS  --SAFE
;

GO




CREATE FUNCTION [dbo].[HtmlDecode](@value [nvarchar](max))
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS 
-- [AssemblyName].[Namespace.Class].[FunctionName]
EXTERNAL NAME [ClrFunctionsLibrary].[ClrFunctionsLibrary.Test].[HtmlDecode]
GO





CREATE FUNCTION [dbo].[HtmlEncode](@value [nvarchar](max))
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS 
-- [AssemblyName].[Namespace.Class].[FunctionName]
EXTERNAL NAME [ClrFunctionsLibrary].[ClrFunctionsLibrary.Test].[HtmlEncode]
GO



/*
EXEC sp_CONFIGURE 'show advanced options' , '1';
 GO
 RECONFIGURE;
 GO
 EXEC sp_CONFIGURE 'clr enabled' , '1'
 GO
 RECONFIGURE;
 GO

EXEC sp_CONFIGURE 'show advanced options' , '0';
 GO
 RECONFIGURE;
*/

然后,您可以像使用普通函数一样使用它:

代码语言:javascript
复制
SELECT
     dbo.HtmlEncode('helloäÖühello123') AS Encoded
    ,dbo.HtmlDecode('hello&auml;&Ouml;&uuml;hello123') AS Decoded 

任何人谁只是复制-粘贴,请注意,出于效率的原因,您将使用

代码语言:javascript
复制
public const double SALES_TAX = 1.086;

// http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx
[SqlFunction()]
public static SqlDouble addTax(SqlDouble originalAmount)
{
     return originalAmount * SALES_TAX;
}

如果您要在生产中使用此函数。

在这里可以看到编辑过的mono类:

http://pastebin.com/pXi57iZ3

http://pastebin.com/2bfGKBte

您需要在生成选项中定义NET_2_0

票数 27
EN

Stack Overflow用户

发布于 2009-03-12 16:22:42

您不应该修复SQL中的字符串。一种更好的方法是在ASP.net中使用一个名为HtmlEncode的函数,这将生成导致您所看到的问题的特殊字符,请参见下面的示例。我希望这能帮到你。

代码语言:javascript
复制
string htmlEncodedStr = System.Web.HttpUtility.HtmlEncode(yourRawStringVariableHere);
string decodedRawStr =  System.Web.HttpUtility.HtmlDecode(htmlEncodedStr);

Edit:因为您是从datatable中绑定数据的。使用内联表达式在GridView的标记或您使用的任何控件中调用HTMLEncode,这仍然可以满足数据绑定需求。请参见下面的示例。或者,您可以循环数据表对象中的每条记录,并在数据绑定之前用html编码的字符串更新每个单元格。

代码语言:javascript
复制
<%# System.Web.HttpUtility.HtmlEncode(Eval("YourColumnNameHere")) %>
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/639393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档