我正在使用这个函数来解码 url 编码的字符串:
ALTER FUNCTION [dbo].[UrlDecode](@url varchar(3072))
RETURNS varchar(3072)
AS
BEGIN
DECLARE @Position INT,
@Base CHAR(16),
@High TINYINT,
@Low TINYINT,
@Pattern CHAR(21)
SELECT @Base = '0123456789abcdef',
@Pattern = '%[%][0-9a-f][0-9a-f]%',
@URL = REPLACE(@URL, '+', ' '),
@Position = PATINDEX(@Pattern, @URL)
WHILE @Position > 0
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, 3, CHAR(16 * @High + @Low - 17)),
@Position = PATINDEX(@Pattern, @URL)
RETURN @URL +
END
这工作正常,直到它达到特殊的 ascii 范围之外的字符。示例:Wil+SG+1
将返回Wil SG 1
没问题。虽然Gen%C3%A8ve+11
返回Genève 11
不是我所期望的(Genève 11
在这种情况下是预期的结果)。
另一个例子 :
select 'Gen%C3%A8ve+2+D%C3%A9p%C3%B4t', dbo.UrlDecode('Gen%C3%A8ve+2+D%C3%A9p%C3%B4t')
返回:
Gen%C3%A8ve+2+D%C3%A9p%C3%B4t Genève 2 Dépôt
我试过用 NCHAR 代替 CHAR 但结果是一样的。你知道我能做些什么来支持这些扩展的 ascii 字符吗?