转义西里尔字母时 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
函数的正则表达式替代方案。它适用于 Unicode
和 ASCII
字符,这里是 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 €
我有一个 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
函数的正则表达式替代方案。它适用于 Unicode
和 ASCII
字符,这里是 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 €