Что нового

Кодировка в POST запросе

Heler

Знающий
Сообщения
70
Репутация
11
Всем привет! POST запросом посылаю строку "привет". На другом конце сервер получает - "??N??????µN?". Каким образом мне необходимо преобразовать строку, что бы получатель принял - "привет"? С латиницей проблем нет.

Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", 'http://somesite.ru/index.php')
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.Send('string=привет')
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Heler
А если попробовать передавать в бинарном виде?
Код:
$sString = 'привет'
MsgBox(64, 'Info', StringToBinary($sString) & @LF & BinaryToString(StringToBinary($sString)))
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
dwerf
Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", 'http://somesite.ru/index.php')
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.Send('string=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82')

Получил - ??N??????µN?

madmasles
Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", 'http://somesite.ru/index.php')
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.Send('string='&BinaryToString(StringToBinary('привет')))

Опять получил - ??N??????µN?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Heler
Я имел в виду отправлять
Код:
$sString = 'привет'
;...
$oHTTP.Send('string=' & StringToBinary($sString))
;а при получении
;...
$sResp = $oHTTP.ResponseText
$sResp = BinaryToString($sResp)
;...

А Вы отправляете BinaryToString(StringToBinary('привет')) тот же 'привет'.
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
madmasles, когда я писал про получателя, имел в виду php скрипт на веб сервере.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Heler
Попробуйте поэкспериментировать с Encoding.au3. Перекодируйте строку перед отправкой в разные кодировки, может найдете нужную.
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Проблема скорее всего в получателе.
Сам пробывал посылать на сервер так же текст, php скрипт отлично все распозновал.

UPD:
Вообще то щас вспомнил, данные я отправлял через IE в параметре, а не через WinHttp. Так что как временное решение можно так же сделать.
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
madmasles, пробовал. Не получилось :(

r35p3ct, с получателем все нормально. Если отправлять из формы html, то все приходит как и должно. :smile:
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Heler
Подправил свой пост.

Тогда может это косяк самого Winhttp, попробуй так:
Код:
$oHTTP = ObjCreate('Msxml2.XMLHTTP.6.0')


или еще как вариант послылать через TCPsend
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
r35p3ct
У меня (на XP SP3 32) не работает. :(
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
После совета dwerf, я сделал ошибку. Поленился и перевел строку с помощью google, получив - %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82. Там символ кодируется в Юникоде (UTF-8) в последовательность из двух байтов, а затем каждый байт этой последовательности записывается в шестнадцатеричном представлении. А мне нужно было банально перевести каждый символ в шестнадцатеричное представление. Теперь работает:
Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", 'http://somesite.ru/index.php')
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.Send('string=%EF%F0%E8%E2%E5%F2')

Но есть еще одно усложнение. Когда записываю данные в файл, которые пришли в ответ на POST запрос, кириллица выглядит так:
Код:
Niune yoeo aaenoaee? Nae?an ia aiaaaeaiea ?ania aey aeeuaee oeaao ia aieuoa
Данный код демонстрирует это:
Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", 'http://korefan.info/news.php')
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.Send()
$oHTTP.WaitForResponse
FileWrite('C:\somefile.txt', $oHTTP.ResponseText)

Помогите пожалуйста научить скрипт правильно писать кириллицу в файл.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Heler [?]
А мне нужно было банально перевести каждый символ в шестнадцатеричное представление.
Так:
Код:
$sString = 'привет'
$sNewString = ''
$aString = StringSplit($sString, '')

For $i = 1 To $aString[0]
	$sNewString &= '%' & Hex(StringToBinary($aString[$i]))
Next
MsgBox(64, 'Info', $sNewString)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
CreatoR [?]
В Encoding.au3 есть для этого функция:
Я пробовал. Они другие значения возвращают:
Код:
#include <Encoding.au3>

$sString = 'привет'
$sNewString = ''

$aString = StringSplit($sString, '')
For $i = 1 To $aString[0]
	$sNewString &= '%' & Hex(StringToBinary($aString[$i]))
Next
MsgBox(64, 'Info', '_Encoding_URLToHex: ' & _Encoding_URLToHex($sString) & @LF & _
		'_Encoding_URIEncode: ' & _Encoding_URIEncode($sString) & @LF & _
		'Надо: ' & $sNewString)
; обе функции возвращают %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
; а надо, как я понял %EF%F0%E8%E2%E5%F2


Heler [?]
После совета dwerf, я сделал ошибку. Поленился и перевел строку с помощью google, получив - %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82. Там символ кодируется в Юникоде (UTF-8) в последовательность из двух байтов, а затем каждый байт этой последовательности записывается в шестнадцатеричном представлении. А мне нужно было банально перевести каждый символ в шестнадцатеричное представление.
Я не знаю, как называется эта кодировка: %EF%F0%E8%E2%E5%F2.
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
madmasles [?]
Я не знаю, как называется эта кодировка: %EF%F0%E8%E2%E5%F2.
как ни странно она называется просто "URL кодировкой" иногда на пен-форумах можно встретить «percent-encoding» (кодирока через знак процента), совоя специфическая...
Re: wikipedia
...Сначала каждый символ кириллицы кодируется в Юникоде (UTF-8) в последовательность из двух байтов, а затем каждый байт этой последовательности записывается в шестнадцатеричном представлении:
 
Верх