この関数を使用して、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 スコープ外の特別な文字に到達するまで正常に機能します。例 :どちらが OK かWil+SG+1
を返します。Wil SG 1
whileGen%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
CHAR の代わりに NCHAR を使用してみましたが、結果は同じです。これらの拡張ASCII文字をサポートするために私ができることを知っていますか?