Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UTF8 при отправке POST-запроса, смс отправка 
V
    Опции темы
ishimcity
Дата 2.12.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 1.6.2007
Где: Тюменская область . Ишим

Репутация: нет
Всего: 1



помогите плиз как преобразовать 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();




PM MAIL ICQ Skype YIM   Вверх
tol05
Дата 3.12.2007, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 6
Всего: 170



ну а метод
Код

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

не помогает?


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ishimcity
Дата 3.12.2007, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 1.6.2007
Где: Тюменская область . Ишим

Репутация: нет
Всего: 1



Я Вас правильно понял,вот так?
в ответ опять одни ?????????

Код

            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();
            




Это сообщение отредактировал(а) ishimcity - 3.12.2007, 07:29
PM MAIL ICQ Skype YIM   Вверх
Experimenter
Дата 3.12.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Код

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();
        }
    }
}



--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
tol05
Дата 3.12.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 6
Всего: 170



Да, что-то типа такого, как Experimenter написал. Только пусть "аффтар" скажет, "зачот" или нет smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ishimcity
Дата 3.12.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 1.6.2007
Где: Тюменская область . Ишим

Репутация: нет
Всего: 1



Вопщем ребята такая ситуация  попробвал так и так , я незнаю я вопще начинающий может я чего недогоняю....вот примеры

Код

 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 
PM MAIL ICQ Skype YIM   Вверх
stab
Дата 3.12.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



вместо Encoding.ASCII.GetBytes надо Encoding.UTF8.GetBytes и всё, кодировку выставить ещё надо в заголовках - Content-Encoding, Content-Length надо брать из utf8Bytes.Length.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Experimenter
Дата 3.12.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



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 );                                           \\ это по примеру

если по моему примеру, то посмотри внимательнее, к правильному результату это не привело

Это сообщение отредактировал(а) Experimenter - 3.12.2007, 20:23


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
stab
Дата 3.12.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



Experimenter, тогда MyRequest.ContentLength не верно устанавливается для не ASCII-символов.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Experimenter
Дата 3.12.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



stab, тоже верно, как верно и то, что редко этот контент-лент требуется кому-то, можно его вообще закомментировать и посмотреть, пройдет или нет.
Хотя это может решить только данную проблему (а может и нет).
Дайте мне урл ваще, я сам посмотрю.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
stab
Дата 3.12.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



Experimenter, дело в том, что вывалится вышеупомянутое исключение: Bytes to be written to the stream exceed the Content-Length bytes size specified.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Experimenter
Дата 3.12.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



stab, дык оно еще при записи в исходящий стрим вываливается, проверьте.
Как-то решил я эту проблему двумя слэшами, иначе б не говорил, хоть и стыдно этим хвастать.
Ну да ладно, будем решать вопрос так, как он поставлен.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
stab
Дата 3.12.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



Цитата(Experimenter @  4.12.2007,  00:55 Найти цитируемый пост)
дык оно еще при записи в исходящий стрим вываливается, проверьте.

дык ясен перец. smile


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
tol05
Дата 4.12.2007, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 6
Всего: 170



Цитата(ishimcity @  3.12.2007,  13:27 Найти цитируемый пост)
ошибка в этой строке
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 );
//ну и т.д.


Это сообщение отредактировал(а) tol05 - 4.12.2007, 00:31


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ishimcity
Дата 4.12.2007, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 1.6.2007
Где: Тюменская область . Ишим

Репутация: нет
Всего: 1



Урааааааа MyRequest.ContentLength = utf8Bytes.Length; вот в чем проблема была.....Всем спасибо и зачет.... smile 

Это сообщение отредактировал(а) ishimcity - 4.12.2007, 06:05
PM MAIL ICQ Skype YIM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.4588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.