2

この関数を使用して、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 1whileGen%C3%A8ve+11Genè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文字をサポートするために私ができることを知っていますか?

4

3 に答える 3

3

URL は UTF-8 でエンコードされます。関数が行うことは、URL の UTF-8 表現の 16 進コードを 16 進コードに一致する文字に置き換えるだけです。

本当に必要なのは、Social.MSDN のこの回答に投稿されているように、URL エンコードされた UTF-8 を MSSQL UCS-2 に置き換える関数です。

于 2013-02-26T20:19:09.883 に答える
2

私はこの関数が私が望むものを正確に達成することを発見しました:

ALTER FUNCTION [dbo].[UrlDecodeUTF8](@URL varchar(3072))
RETURNS varchar(3072)
AS
BEGIN 
    DECLARE @Position INT,
        @Base CHAR(16),
        @Code INT,
        @Pattern CHAR(21)

    SELECT @URL = REPLACE(@URL, '%c3', '')

    SELECT  @Base = '0123456789abcdef',
        @Pattern = '%[%][0-9a-f][0-9a-f]%',
        @Position = PATINDEX(@Pattern, @URL)

    WHILE @Position > 0
        SELECT @Code = Cast(CONVERT(varbinary(4), '0x' + SUBSTRING(@URL, @Position + 1, 2), 1) As int),
            @URL = STUFF(@URL, @Position, 3, NCHAR(@Code + 64)),
            @Position = PATINDEX(@Pattern, @URL)

    RETURN REPLACE(@URL, '+', ' ')

END
于 2013-02-27T07:37:47.387 に答える
-1

UTFコードを同等のASCIIコードに置き換えて、照合をいじる必要があると思います。コードライブラリにある例を次に示します。

REPLACE(CHAR(228) COLLATE Latin1_General_BIN, CHAR(196), 'Y')
于 2013-02-26T17:47:40.487 に答える