UTF8 при отправке POST-запроса

 
0
 
.NET
ava
ishimcity | 02.12.2007, 17:48
помогите плиз как преобразовать ANСII в UTF8


postData="ПРИВЕТ" // Сервер непонимает русский поэтому ничего нету в ответ как перевести в UTF8?
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = Encoding.Default.GetBytes(postData);
MyRequest.Referer = z;
MyRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
MyRequest.ContentType = "application/x-www-form-urlencoded";
MyRequest.AllowAutoRedirect = false;
MyRequest.ContentLength = postData.Length;
Stream newStream = MyRequest.GetRequestStream();
newStream.Write(byte1, 0, byte1.Length);
newStream.Close();
HttpWebResponse myHttpWebResponse = (HttpWebResponse)MyRequest.GetResponse();



Comments (15)
ava
tol05 | 03.12.2007, 00:23 #
ну а метод

Encoding.Convert(Encoding, Encoding, Byte[])

не помогает?
ava
ishimcity | 03.12.2007, 06:43 #
Я Вас правильно понял,вот так?
в ответ опять одни ?????????


ASCIIEncoding encoding = new ASCIIEncoding();
UTF8Encoding utf8Encoding = new UTF8Encoding();
byte[] byte1 = encoding.GetBytes(postData);
byte[] utf = Encoding.Convert(encoding, utf8Encoding, byte1);
.
.
.
newStream.Write(utf, 0, utf.Length);
newStream.Close();



ava
Experimenter | 03.12.2007, 10:23 #

using System;
using System.Text;

namespace EncodingConsole
{
class Program
{
static void Main(string[] args)
{
string prevedString = "ПРЕВЕД МЕДВЕД!";
Console.WriteLine(prevedString+"\r\nПереведем в ASCII, потом в UTF8");
byte[] asciiBytes = Encoding.ASCII.GetBytes(prevedString);
byte[] utf8Bytes = Encoding.Convert(Encoding.ASCII, Encoding.UTF8, asciiBytes);
Console.WriteLine(Encoding.UTF8.GetString(utf8Bytes));
Console.WriteLine("Не получаецца... Пойдем другим путем");
byte[] win1251Bytes = Encoding.GetEncoding(1251).GetBytes(prevedString);
Console.WriteLine("Родную кодировку переведем в UTF8");
utf8Bytes = Encoding.Convert(Encoding.GetEncoding(1251), Encoding.UTF8, win1251Bytes);
Console.WriteLine(Encoding.UTF8.GetString(utf8Bytes));
Console.WriteLine("ПОЛУЧИЛОСЬ!!! АФФТАРУ ЗАЧОТ!!!");
Console.ReadLine();
}
}
}
ava
tol05 | 03.12.2007, 10:40 #
Да, что-то типа такого, как Experimenter написал. Только пусть "аффтар" скажет, "зачот" или нет smile
ava
ishimcity | 03.12.2007, 14:27 #
Вопщем ребята такая ситуация попробвал так и так , я незнаю я вопще начинающий может я чего недогоняю....вот примеры


HttpWebRequest MyRequest = (HttpWebRequest)WebRequest.Create(z);
MyRequest.Method = "POST";
string postData = "&code=" + cod.Text + "&phone=" + tel.Text + "&text=" + sms.Text + "&cookie=" + rc;
tex.Text = z + ":" + postData;
byte[] asciiBytes = Encoding.ASCII.GetBytes(postData ); \\ это по примеру
byte[] utf8Bytes = Encoding.Convert(Encoding.ASCII, Encoding.UTF8, asciiBytes);
MyRequest.Referer = s;
MyRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
MyRequest.ContentType = "application/x-www-form-urlencoded";

if (!String.IsNullOrEmpty(sCookies))
{
MyRequest.Headers.Add(HttpRequestHeader.Cookie, sCookies);
}

MyRequest.AllowAutoRedirect = false;
MyRequest.ContentLength = postData.Length;
Stream newStream = MyRequest.GetRequestStream();
newStream.Write(utf8Bytes, 0, utf8Bytes.Length);
newStream.Close();
HttpWebResponse myHttpWebResponse = (HttpWebResponse)MyRequest.GetResponse();

MessageBox.Show("Ваше Сообщение отправлено!");



Пришло только ??????????? .
Вариант 2.




HttpWebRequest MyRequest = (HttpWebRequest)WebRequest.Create(z);
MyRequest.Method = "POST";
string postData = "&code=" + cod.Text + "&phone=" + tel.Text + "&text=" + sms.Text + "&cookie=" + rc;
tex.Text = z + ":" + postData;
byte[] win1251Bytes = Encoding.GetEncoding(1251).GetBytes(postData );
byte[] utf8Bytes = Encoding.Convert(Encoding.GetEncoding(1251), Encoding.UTF8, win1251Bytes);
MyRequest.Referer = s;
MyRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
MyRequest.ContentType = "application/x-www-form-urlencoded";

if (!String.IsNullOrEmpty(sCookies))
{
MyRequest.Headers.Add(HttpRequestHeader.Cookie, sCookies);
}

MyRequest.AllowAutoRedirect = false;
MyRequest.ContentLength = postData.Length;
Stream newStream = MyRequest.GetRequestStream();
newStream.Write(utf8Bytes, 0, utf8Bytes.Length);
newStream.Close();
HttpWebResponse myHttpWebResponse = (HttpWebResponse)MyRequest.GetResponse();

MessageBox.Show("Ваше Сообщение отправлено!");



ошибка в этой строке
newStream.Write(utf8Bytes, 0, utf8Bytes.Length);
Bytes to be written to the stream exceed the Content-Length bytes size specified.

Будте любезны ткните меня носом в ошибку smile
ava
stab | 03.12.2007, 14:38 #
вместо Encoding.ASCII.GetBytes надо Encoding.UTF8.GetBytes и всё, кодировку выставить ещё надо в заголовках - Content-Encoding, Content-Length надо брать из utf8Bytes.Length.
ava
Experimenter | 03.12.2007, 20:14 #
ishimcity, есть еще вариант - не заморачиваться с байтами а применить StreamWriter, у которого есть перегруженный конструктор, в нем можно явно кодировку указать.

HttpWebRequest MyRequest = (HttpWebRequest)WebRequest.Create(z);
MyRequest.Method = "POST";
string postData = "&code=" + cod.Text + "&phone=" + tel.Text + "&text=" + sms.Text + "&cookie=" + rc;
MyRequest.Referer = s;
MyRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
MyRequest.ContentType = "application/x-www-form-urlencoded";

if (!String.IsNullOrEmpty(sCookies))
{
MyRequest.Headers.Add(HttpRequestHeader.Cookie, sCookies);
}

MyRequest.AllowAutoRedirect = false;
MyRequest.ContentLength = postData.Length;
Stream newStream = MyRequest.GetRequestStream();
StreamWriter sw = new StreamWriter(newStream, Encoding.UTF8);
sw.Write(postData);
sw.Flush();
sw.Close();
HttpWebResponse myHttpWebResponse = (HttpWebResponse)MyRequest.GetResponse();
MessageBox.Show("Ваше Сообщение отправлено!");
Иногда помогает.
Цитата


byte[] asciiBytes = Encoding.ASCII.GetBytes(postData );  \\ это по примеру


если по моему примеру, то посмотри внимательнее, к правильному результату это не привело
ava
stab | 03.12.2007, 20:22 #
Experimenter, тогда MyRequest.ContentLength не верно устанавливается для не ASCII-символов.
ava
Experimenter | 03.12.2007, 20:28 #
stab, тоже верно, как верно и то, что редко этот контент-лент требуется кому-то, можно его вообще закомментировать и посмотреть, пройдет или нет.
Хотя это может решить только данную проблему (а может и нет).
Дайте мне урл ваще, я сам посмотрю.
ava
stab | 03.12.2007, 20:41 #
Experimenter, дело в том, что вывалится вышеупомянутое исключение: Bytes to be written to the stream exceed the Content-Length bytes size specified.
ava
Experimenter | 03.12.2007, 20:55 #
stab, дык оно еще при записи в исходящий стрим вываливается, проверьте.
Как-то решил я эту проблему двумя слэшами, иначе б не говорил, хоть и стыдно этим хвастать.
Ну да ладно, будем решать вопрос так, как он поставлен.
ava
stab | 03.12.2007, 23:25 #
Цитата (Experimenter @ 4.12.2007, 00:55 findReferencedText)
дык оно еще при записи в исходящий стрим вываливается, проверьте.

дык ясен перец. smile
ava
tol05 | 04.12.2007, 00:29 #
Цитата (ishimcity @ 3.12.2007, 13:27 findReferencedText)
ошибка в этой строке

newStream.Write(utf8Bytes, 0, utf8Bytes.Length);

Bytes to be written to the stream exceed the Content-Length bytes size specified.

написано, что в Content-Length установлено меньшее количество байт, чем ты хочешь передать. И это неудивительно, т.к. в Content-Length записано кол-во символов строки (postData.Length), а не размер массива байт.
Т.е. если строка имеет 20 символов, то Content-Length=20, а utf8Bytes.Length=?
Цитата


UTF-8, which represents each code point as a sequence of one to four bytes.


нужно во втором варианте

MyRequest.ContentLength = utf8Bytes.Length; //!!!
Stream newStream = MyRequest.GetRequestStream();
newStream.Write(utf8Bytes, 0, utf8Bytes.Length);

ИМХО первый вариант не работает, потому что принятый поток нужно тоже читать с указанием кодировки

Stream ReceiveStream = myWebResponse.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader( ReceiveStream, encode );
//ну и т.д.
ava
ishimcity | 04.12.2007, 06:04 #
Урааааааа MyRequest.ContentLength = utf8Bytes.Length; вот в чем проблема была.....Всем спасибо и зачет.... smile3
ava
daniloff | 06.02.2008, 10:57 #
а Uri.EscapeUriString() для кого придумано? smile
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit