tsql URL encode

Александр_Щ
Дата: 20.02.2013 11:21:56
Добрый день.
Столкнулся с проблемой передачи httsp запрос c mssql в формате win1251, но русские символы закодированы 'а - %e0' и другие коды
Сейчас обошелся таким образом
Declare @URI nvarchar(4000)
DECLARE @count int, @i int, @urlReturn nvarchar(4000)
Declare @s char

select @URI = 'http://yandex.ru/yandsearch?text=Тест'


SET @count = LEN(@URI)
SET @i = 1
SET @urlReturn = ''

while (@i <= @count)
begin 
  select @s = SUBSTRING(@URI, @i, 1)
  if (ASCII(@s) > 191 AND ASCII(@s) <= 256)
  begin
    select @urlReturn = @urlReturn + sys.fn_varbintohexstr(CAST(@s AS VARBINARY(MAX)))
    select @urlReturn = replace(@urlReturn, '0x', '%')
  end
  else
    select @urlReturn = @urlReturn + @s

  set @i = @i +1
end

select   @urlReturn     
    

на выходе http://yandex.ru/yandsearch?text=%d2%e5%f1%f2
Как поэлегантнее можно сделать?
iiyama
Дата: 20.02.2013 13:02:07
buser
Дата: 20.02.2013 13:45:01
Александр_Щ
с проблемой передачи httsp запрос c mssql

А это пока ваша единственная беда? Напишите CLR Proc... Раз пошла такая пьянка...
qwerty112
Дата: 20.02.2013 14:10:50
Александр_Щ
на выходе http://yandex.ru/yandsearch?text=%d2%e5%f1%f2

вообщето, "Тест" должен кодироватся как %D0%A2%D0%B5%D1%81%D1%82 ...
Declare @URI varchar(4000)
DECLARE @count int, @i int, @urlReturn nvarchar(4000)
Declare @s char

select @URI = 'Тест'

	DECLARE @object int
	DECLARE @object2 int
	DECLARE @hr int

	EXEC @hr=sp_OACreate 'ScriptControl', @object OUT
	EXEC @hr = sp_OASetProperty @object, 'Language', 'JScript'
	EXEC @hr=sp_OAMethod @object, 'Eval', @object2 OUT, 'this' 
	EXEC @hr=sp_OAMethod @object2, 'encodeURIComponent', @urlReturn OUT, @URI

	EXEC @hr=sp_OADestroy @object2
	EXEC @hr=sp_OADestroy @object

select 'http://yandex.ru/yandsearch?text='+@urlReturn

--------------------------------------------------------------------------------------------------------------
http://yandex.ru/yandsearch?text=%D0%A2%D0%B5%D1%81%D1%82

(1 row(s) affected)
aleks2
Дата: 20.02.2013 14:25:08
Когда-то делал для декодировки

ALTER FUNCTION dbo.f_URLDecode
(@str varchar(4000))
RETURNS nvarchar(4000)
AS
BEGIN
  declare @s nvarchar(4000), @o int
  select @s=@str, @o=0

  while (exists(select * FROM dbo.[URLcode] WHERE [order]=@o)) begin
     select @s=REPLACE(@s collate Cyrillic_General_CS_AS, [code] collate Cyrillic_General_CS_AS, [char] collate Cyrillic_General_CS_AS)
     FROM dbo.[URLcode] WHERE [order]=@o
     set @o=@o+1
 end

RETURN @s
END


Но, наверна, можна и кодировать так же?
Хде брал таблицу [URLcode] - не помню.
Александр_Щ
Дата: 21.02.2013 11:59:09
buser
Александр_Щ
с проблемой передачи httsp запрос c mssql

А это пока ваша единственная беда? Напишите CLR Proc... Раз пошла такая пьянка...

Сначала была беда с использованием сертификатов, чуть не до самописного ActiveX компонента дошел, но решил задачу через ActiveXObject("WinHttp.WinHttpRequest.5.1");
По теме, так это не беда, просто в своих запросах я перевожу только русские буквы, но как оказалось часть символы не воспринимается сервером в https запросах, но это решил строками replace в конце процедуры, типа select @urlReturn = replace(@urlReturn, ' ', '%20') для замены пробелов. Сейчас тестирую разные запросы и проверяю такие спец символы.

qwerty112
Александр_Щ
на выходе http://yandex.ru/yandsearch?text=%d2%e5%f1%f2

вообщето, "Тест" должен кодироватся как %D0%A2%D0%B5%D1%81%D1%82 ...
--------------------------------------------------------------------------------------------------------------
http://yandex.ru/yandsearch?text=%D0%A2%D0%B5%D1%81%D1%82

(1 row(s) affected)


Использование encodeURIComponent не подходит, видимо сервер не поддерживает decodeURIComponent

aleks2
Когда-то делал для декодировки

Но, наверна, можна и кодировать так же?
Хде брал таблицу [URLcode] - не помню.

Спасибо, попробую, таблицу тожно взять из сообщения iiyama.
iiyama
Александр_Щ, Таблица символов кодирования URL