我需要一些帮助来微调 T-SQL 函数以正确解码包含 URL 的字符串。只有查询字符串参数值是 URLEcoded(而不是整个 URL)。原始函数在解码单字节字符时效果很好,但它不能处理多字节字符。为了解决西班牙重音字符等多字节字符的解码;我的计划是使用 PATINDEX 查找值并使用查找表替换那些值(这是因为我们正在处理属于这一类别的少数有限数量的特殊字符)。
问题: 下面指定的模式没有返回任何匹配项,因此我几乎被困在这一点上。
示例: 模式 '%[%][0-9a-f][0-9a-f]%' 适用于单字节编码字符。同样模式 '%[%][0-9a-f][0-9a-f][%][0-9a-f][0-9a-f][%][0-9a-f][0 -9a-f][%][0-9a-f][0-9a-f]%'应该适用于双字节字符,例如 (%C3%A9 -> ) ,但它不是。
这是我的代码:
DECLARE @Position INT,
@Base CHAR(16),
@High TINYINT,
@Low TINYINT,
@Pattern VARCHAR(256),
@URL VARCHAR(8000)
SET @Url = '%26Text1%3DFrom%20Ren%C3%A9%27s'
SELECT @Base = '0123456789abcdef',
@Pattern = '%[%][0-9a-f][0-9a-f][%][0-9a-f][0-9a-f]%',
--@URL = REPLACE(@URL, '+', ' '),
@Position = PATINDEX(@Pattern, @URL)
PRINT 'Position: ' + + CAST(@Position AS Varchar(256))
WHILE @Position > 0
BEGIN
SELECT
@High = CHARINDEX(SUBSTRING(@URL, @Position + 1, 1), @Base COLLATE Latin1_General_CI_AS),
@Low = CHARINDEX(SUBSTRING(@URL, @Position + 2, 1), @Base COLLATE Latin1_General_CI_AS),
@URL = STUFF(@URL, @Position, 6, '123456'),
@Position = PATINDEX(@Pattern, @URL)
PRINT 'High: ' + CAST(@High AS Varchar(256))
PRINT @URL
END