转义西里尔字母时 JavaScript escape() 的 C# 替代方案

C# alternative of JavaScript escape() when Cyrillic words are escaped

我有一个 Web 应用程序,它是 sending/inserting 数据到数据库 table。这些值使用 JavaScript escape() 函数进行转义。例如:

escape('това е текст')

将文本转换为以下格式:

%u0442%u043E%u0432%u0430%20%u0435%20%u0442%u0435%u043A%u0441%u0442

我想 unescape 文本并在 T-SQL 存储过程中进行一些操作。

请注意,我无法更改值 escaped 和记录在数据库 table 中的方式。

为了做到这一点,我使用一些内置 .net 功能创建了几个 SQL CLR 函数:

问题是这些函数无法 decode/unescape 给定值,因为它包含 Cyrillic 个字符:

SELECT [dbo].[fn_urlDecode] (N'%u0442%u043E%u0432%u0430%20%u0435%20%u0442%u0435%u043A%u0441%u0442')
SELECT [dbo].fn_HtmlDecode (N'%u0442%u043E%u0432%u0430%20%u0435%20%u0442%u0435%u043A%u0441%u0442')
SELECT [dbo].[fn_UnescapeDataString] (N'%u0442%u043E%u0432%u0430%20%u0435%20%u0442%u0435%u043A%u0441%u0442')

请注意,如果使用 SQL CLR encode/escape 和 decode/unescape 函数一切正常:

SELECT [dbo].[fn_UrlEncode] (N'това е текст')
SELECT [dbo].[fn_urlDecode] ([dbo].[fn_UrlEncode] (N'това е текст'))

所以,我想问题是我找不到可以正确处理由 JavaScript escape() 函数转换的值的 .net decode/unescape 函数。

有人可以建议如何解决这个问题吗?

HttpUtility.UrlDecode("%u0442%u043E%u0432%u0430%20%u0435")

适合我。

不过您确实需要参考 System.Web

因为我无法使用 System.Web.dll,所以我实现了 HttpUtility.UrlDecode 函数的正则表达式替代方案。它适用于 UnicodeASCII 字符,这里是 C# 定义:

/// <summary>
///    Regular expression implementation of the the JavaScript unescape method
/// </summary>
/// <param name="sqlValue">A JavaScript escaped string</param>
/// <returns>Unescaped representation of the input string</returns>
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString Unescape(SqlString sqlValue)
{
    if (sqlValue.IsNull)
    {
        return new SqlString("");
    }
    else
    {
        string buffer = sqlValue.Value;

        //replacing "Unicode" characters
        buffer = Regex.Replace(buffer, @"%U([0-9A-F]{4})", match => ((char)int.Parse(match.Groups[1].Value, NumberStyles.HexNumber)).ToString(), RegexOptions.IgnoreCase);
        //replacing "ASCII" character
        buffer = Regex.Replace(buffer, @"%([0-9A-F]{2})", match => ((char)int.Parse(match.Groups[1].Value, NumberStyles.HexNumber)).ToString(), RegexOptions.IgnoreCase);

        return new SqlString(buffer);
    }
}

例如:

SELECT [dbo].[fn_RegexUnescape](N'%u0442%u043E%u0432%u0430%20%u0435%20text%20%14%u20AC');

returns:

това е text €