T-SQL में HTML एन्कोडिंग?

वोट
13

वहाँ T-SQL में HTML तार एन्कोड करने के लिए किसी भी समारोह है? मैं एक विरासत डेटाबेस है जो इस तरह के रूप में dodgey वर्ण हैं है '<', '>' आदि मैं पात्रों को बदलने के लिए एक समारोह लिखने लेकिन वहाँ एक बेहतर तरीका है सकते हैं?

मैं एक ASP.Net आवेदन किया है और जब यह एक स्ट्रिंग रिटर्न यह केरेक्टर जो एक त्रुटि का कारण होता है। ASP.Net आवेदन एक डेटाबेस तालिका से डेटा पढ़ रहा है। यह तालिका में ही लिखना नहीं है।

12/03/2009 को 17:18
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


10 जवाब

वोट
21

हम एक विरासत प्रणाली एक ट्रिगर और dbmail का उपयोग करता है जब एक मेज दर्ज किया गया है एचटीएमएल इनकोडिंग ईमेल भेजने के लिए है, इसलिए हम ईमेल पीढ़ी के भीतर एन्कोडिंग की आवश्यकता है। मैंने देखा लियो संस्करण एक मामूली बग कि कूटबद्ध और है कि &lt;और &gt;मैं इस संस्करण का उपयोग करें:

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
25/09/2009 को 11:33
का स्रोत उपयोगकर्ता

वोट
19

यह थोड़ी देर हो चुकी है, लेकिन वैसे भी, यहाँ उचित तरीके:

एचटीएमएल-एनकोड (एचटीएमएल एन्कोडिंग = एक्सएमएल एन्कोडिंग):

DECLARE @s NVARCHAR(100)
SET @s = '<html>unsafe & safe Utf8CharsDon''tGetEncoded ÄöÜ - "Conex"<html>'
SELECT (SELECT @s FOR XML PATH(''))

एक प्रश्न में HTML एन्कोड:

SELECT 
    FIELD_NAME  
    ,(SELECT FIELD_NAME AS [text()] FOR XML PATH('')) AS FIELD_NAME_HtmlENcoded 
FROM TABLE_NAME

एचटीएमएल-डिकोड:

SELECT CAST('<root>' + '&lt;root&gt;Test&amp;123' + '</root>' AS XML).value(N'(root)[1]', N'varchar(max)');

आप इसे ठीक तरह से करना चाहते हैं, तो आप एक CLR संग्रहीत प्रक्रिया का उपयोग कर सकते हैं।
हालांकि, यह थोड़ा जटिल हो जाता है, क्योंकि आप CLR संग्रहीत-प्रक्रियाओं में System.Web-विधानसभा उपयोग नहीं कर सकते (ताकि आप ऐसा नहीं कर सकते System.Web.HttpUtility.HtmlDecode (htmlEncodedStr);)। तो आप अपने खुद के HttpUtility वर्ग है, जो मैं सिफारिश नहीं होगा, खासकर डिकोडिंग के लिए लिखने के लिए की है।

सौभाग्य से, आप मोनो sourcecode (लिनक्स के लिए नेट) से बाहर System.Web.HttpUtility चीर कर सकते हैं। तो फिर तुम system.web संदर्भ के बिना HttpUtility उपयोग कर सकते हैं।

तो फिर तुम इस CLR-संग्रहित-प्रक्रिया लिखें:

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

और यह रजिस्टर:

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;
*/

बाद में, आप यह सामान्य कार्यों की तरह उपयोग कर सकते हैं:

SELECT
     dbo.HtmlEncode('helloäÖühello123') AS Encoded
    ,dbo.HtmlDecode('hello&auml;&Ouml;&uuml;hello123') AS Decoded 

जो कोई भी बस कॉपी-पेस्ट, कृपया ध्यान दें दक्षता कारणों के लिए, आप का प्रयोग करेंगे

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;
}

यदि आप उत्पादन में इस समारोह का उपयोग करेंगे।

यहाँ संपादित मोनो कक्षाओं के लिए देखें:
http://pastebin.com/pXi57iZ3
http://pastebin.com/2bfGKBte

आप निर्माण के लिए विकल्पों में NET_2_0 परिभाषित करने की जरूरत बिल्ड विकल्प

09/01/2013 को 13:00
का स्रोत उपयोगकर्ता

वोट
14

आप एसक्यूएल में स्ट्रिंग को ठीक नहीं चाहिए। एक बेहतर तरीका ASP.net HtmlEncode कहा जाता है में एक समारोह का उपयोग करने के, इस विशेष वर्ण हैं जो मुद्दों आप नीचे उदाहरण देखें देख रहे हैं कारण खाना बनाना होगा। आशा है कि ये आपकी मदद करेगा।

string htmlEncodedStr = System.Web.HttpUtility.HtmlEncode(yourRawStringVariableHere);
string decodedRawStr =  System.Web.HttpUtility.HtmlDecode(htmlEncodedStr);

संपादित करें: जब से तुम एक datatable से बाध्यकारी डेटा कर रहे हैं। GridView या जो कुछ भी के मार्कअप में HTMLEncode कॉल करने के लिए एक इनलाइन अभिव्यक्ति का प्रयोग कर अपने उपयोग करते हुए और यह अभी भी बाध्यकारी आवश्यकता अपने डेटा को पूरा करेगा नियंत्रित करते हैं। नीचे दिए गए उदाहरण देखें। Alternativly आप पाश डेटा तालिका वस्तु में हर रिकॉर्ड और html इनकोडिंग स्ट्रिंग बाध्यकारी डेटा से पहले साथ प्रत्येक कोशिका को अपडेट कर सकते हैं।

<%# System.Web.HttpUtility.HtmlEncode(Eval("YourColumnNameHere")) %>
12/03/2009 को 17:22
का स्रोत उपयोगकर्ता

वोट
8

मुझे नहीं लगता कि एक डेटाबेस में डेटा पता है या यूजर इंटरफेस के बारे में ध्यान देना चाहिए है। प्रदर्शन संबंधी मामले प्रस्तुति परत द्वारा नियंत्रित किया जाना चाहिए। मैं किसी भी HTML डेटाबेस में मिश्रित देखना चाहता हूँ नहीं होगा।

12/03/2009 को 18:20
का स्रोत उपयोगकर्ता

वोट
2

आप बस 'आपकी क्वेरी में XML पथ' का उपयोग कर सकते हैं। उदाहरण के लिए;

घोषणा @encodedString VARCHAR (मैक्स)

सेट @encodedString = 'अपने html स्ट्रिंग दे आप सांकेतिक शब्दों में बदलना चाहता हूँ'

चयन @encodedString
चुनें (एक्सएमएल पथ के लिए @encodedString का चयन करें ( ''))

अब आपकी इच्छा के रूप में आप आप इस अपनी खुद की एसक्यूएल समारोह में कर सकते हैं। उम्मीद है कि यह मदद मिलेगी।

16/12/2016 को 04:11
का स्रोत उपयोगकर्ता

वोट
2

आप वेब पर एक स्ट्रिंग प्रदर्शित कर रहे हैं, तो आप इसे Server.HTMLEncode साथ सांकेतिक शब्दों में बदलना कर सकते हैं ()।

आप डेटाबेस में एक स्ट्रिंग भंडारण कर रहे हैं, यकीन है कि डाटाबेस क्षेत्र "nchar", बजाय "चार" का है या नहीं। यही कारण है कि यह यूनिकोड तार स्टोर करने के लिए अनुमति देगा।

आप डेटाबेस नियंत्रित नहीं कर सकते हैं, तो आप स्ट्रिंग Encoding.ASCII.GetString साथ ASCII करने के लिए "समतल" कर सकते हैं।

12/03/2009 को 17:33
का स्रोत उपयोगकर्ता

वोट
0

मैं इस बिंदु पर ज्यादातर मनोरंजन के लिए T-SQL में यह आज क्या करना है, के बाद से मेरी आवश्यकताएं बदल की कोशिश कर रहा है, लेकिन मैं एक तरीका खोज निकाला। आप यूनिकोड वर्ण की एक तालिका, NCHAR () फ़ंक्शन से बनाया का उपयोग कर सकते हैं या बस इसे आयात, 0 से 65535 तक का पुनरावृत्ति (या कम अगर आप सिर्फ पहले 512 या कुछ और की जरूरत है)। फिर स्ट्रिंग के पुनर्निर्माण। शायद बेहतर तरीके स्ट्रिंग के पुनर्निर्माण के लिए हैं, लेकिन यह एक चुटकी में काम करता है।

---store unicode chars into a table so you can replace those characters withthe decimal value

`

टेबल #UnicodeCharacters (DecimalValue INT, UnicodeCharacter NCHAR) बनाने के;

--loop from 0 to highest unicode value you want and dump to the table you created
DECLARE @x INT = 0;
WHILE @x <= 65535
    BEGIN
        BEGIN
            INSERT IGNORE  INTO #UnicodeCharacters(DecimalValue, UnicodeCharacter)
            SELECT  @x,NCHAR(@x)
        END
        ;

        SET @x = @x + 1
        ;
    END
;

--index for fast retrieval
CREATE CLUSTERED INDEX CX_UnicodeCharacter_DecimalValue ON #UnicodeCharacters(UnicodeCharacter, DecimalValue);

--this is the string that you want to html-encode...
DECLARE @String NVARCHAR(100) = N'人This is a test - Ñ';

--other vars
DECLARE @NewString NVARCHAR(100) = '';
DECLARE @Word TABLE(Character NCHAR(1));
DECLARE @Pos INT = 1;

--run through the string and check each character to see if it is outside the regex expression
WHILE @Pos <= LEN(@String)
BEGIN
    DECLARE @Letter NCHAR(1) = SUBSTRING(@String,@Pos,1);
    PRINT @Letter;
    --rebuild the string replacing each unicode character outside the regex with &#[unicode value];
    SELECT  @NewString = @NewString + 
                CASE 
                    WHEN @Letter LIKE N'%[0-9abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-!@#$%^&*()_+-= ]%' THEN @Letter
                    ELSE '&#' + CAST(uc.DecimalValue AS VARCHAR(10)) + ';'
                END
    FROM    #UnicodeCharacters uc
    WHERE   @Letter = uc.UnicodeCharacter COLLATE JAPANESE_UNICODE_BIN

    SET @Pos += 1
END

--end result
SELECT @NewString
;

`मैं पता आम तौर पर आप का प्रयोग करेंगे [0-9A-Za-z], लेकिन किसी कारण से, यह जब मैंने वह किया है कि अभिव्यक्ति के दायरे के भीतर उच्चारण वर्ण माना जाता है। तो मैं स्पष्ट रूप से हर चरित्र है कि मैं अभिव्यक्ति में यूनिकोड में बदलने के लिए नहीं करना चाहता था इस्तेमाल किया।

अंतिम ध्यान दें, मैं एक अलग मिलान उपयोग करने के लिए यूनिकोड वर्ण के मैच में करना था, क्योंकि डिफ़ॉल्ट लैटिन मिलान (सीआई या अन्यथा) गलत तरीके से, उच्चारण चिह्न पात्रों पर मैच के लिए बहुत पसंद में regex की तरह लग रहा था।

04/07/2018 को 00:55
का स्रोत उपयोगकर्ता

वोट
0

मैं इस समाधान अपने आप को प्रयास नहीं किया है लेकिन क्या मैं कोशिश करेगा एसक्यूएल सर्वर / .NET CLR एकीकरण का उपयोग और वास्तव में T-SQL से सी # HTMLEncode समारोह कहते हैं। यह अक्षम हो सकता है लेकिन मुझे लगता है कि यह आप सबसे सटीक परिणाम देना होगा।

काम कैसे करना है यह होगा के लिए मेरे प्रारंभिक बिंदु http://msdn.microsoft.com/en-us/library/ms254498%28VS.80%29.aspx

29/07/2011 को 02:09
का स्रोत उपयोगकर्ता

वोट
0

लेबल की संपत्ति पाठ के लिए असाइन करें, यह नेट द्वारा इनकोडिंग ऑटो हो जाएगा

08/11/2010 को 16:40
का स्रोत उपयोगकर्ता

वोट
0

ठीक यहाँ मैं क्या किया है। मैं इसे संभाल करने के लिए एक सरल समारोह बनाया। इसका अब तक पूरा से लेकिन कम से कम मानक संभालती <>&अक्षर। के रूप में मैं साथ जाने मैं सिर्फ यह करने के लिए जोड़ देंगे।

CREATE FUNCTION HtmlEncode
(
    @UnEncoded as varchar(500)
)
RETURNS varchar(500)
AS
BEGIN
    DECLARE @Encoded as varchar(500)   
    SELECT @Encoded = Replace(@UnEncoded,'<','&lt;')
    SELECT @Encoded = Replace(@Encoded,'>','&gt;')
    SELECT @Encoded = Replace(@Encoded,'&','&amp;')   
    RETURN @Encoded    
END

मैं तो उपयोग कर सकते हैं:

Select Ref,dbo.HtmlEncode(RecID) from Customers

यह मैं एक HTML सुरक्षित रिकार्ड आईडी देता है। संभवतः एक समारोह में बनाया गया है, लेकिन मैं यह नहीं मिल रहा है।

15/03/2009 को 20:40
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more