Форум: "Прочее";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];
ВнизКодирование буфера Найти похожие ветки
← →
trxnet © (2010-01-11 14:58) [0]Здраствуйте. Имеется одна проблема. Вобщем я читаю данные из сокета в буфер Buf: Array [0..4096] of Byte. В этом буфере содержится текст + управляющие символы строки (ну все как положено вобщем). Вот мне необходимо текст, который содержится в буфере конвертировать в Unicode кодировку, не трогая управляющие символы и затем уже Unicode-текс обратно поместить в этот буфер. Процедуры кодирования с использованием String не подходят, поскольку если мы перекодируем буфер в String, то управляющие символы туда не попадут. Помогите пожайлуста, как можно реализовать данную вещь. Спасибо.
← →
Anatoly Podgoretsky © (2010-01-11 15:12) [1]> trxnet (11.01.2010 14:58:00) [0]
Что за бред, почему не попадут, еще смешнее их не перекодировать, это же явно портить Юникод строку, лучше врага чем ты и не пожелаешь.
← →
KSergey © (2010-01-11 15:14) [2]Ну первое что мне приходит на ум - выделять из буфера куски строк между управляющими символами, конвертировать их, а потом назад все раскладывать включая неконвертированные упр. символы, не забывая про то, что юникод - в 2 раза длинее.
Ну или посимвольно бежать по буферу и перекладывать в другой, конвертируя каждый символ, если это буква, или не конвертируя, если это управл. символ.
← →
test © (2010-01-11 15:15) [3]Похоже на Indy, там параметр в true ставишь и получаешь нормально строку.
← →
trxnet © (2010-01-11 15:23) [4]Просто когда на сокет получаю данные, от клиента вот так:
procedure TForm1.sReceive(MSocket: TMySocket);
var
Len: Integer;
Buf: Array [0..4096] of Char;
Msg: String;
begin
Len := MSocket.GetBuf(Buf,SizeOf(Buf));
client.SendBuf(Buf,Len);
while Len > 0 do
begin
Msg := Msg + Copy(Buf, 1, Len);
Len := MSocket.GetBuf(Buf, SizeOf(Buf));
end;
end;
Вот так я принимаю и потправляю клиенту буфер. Только в данном случае тип буфера Char это не работает, т.к почемуто управляющие символы не входят сюда.
Но если сделать вот так:
procedure TForm1.sReceive(MSocket: TMySocket);
var
Len: Integer;
Buf: Array [0..4096] of Byte;
Msg: String;
begin
Len := MSocket.GetBuf(Buf,SizeOf(Buf));
client.SendBuf(Buf,Len);
end;
То все прекрасно работает, клиент понимает что ему пришло.
← →
trxnet © (2010-01-11 15:25) [5]Т.е схема такая, клиент послылает серверу строку, сервер ее обрабатывает и конвертирует в Unicode и затем отсылает клиенту.
← →
soldier (2010-01-11 15:26) [6]У людей избыток серверов =)
← →
trxnet © (2010-01-11 19:58) [7]А если серьезно?
← →
Германн © (2010-01-11 19:59) [8]
> А если серьезно?
Либо [1], либо [2]
← →
trxnet © (2010-01-11 20:21) [9]
Либо [1], либо [2]
Хорошо) А как это сделать ?) И как смотреть, что это управляющий символ или нет.
← →
test © (2010-01-11 20:27) [10]trxnet © (11.01.10 20:21) [9]
По коду
← →
Anatoly Podgoretsky © (2010-01-11 20:30) [11]> trxnet (11.01.2010 20:21:09) [9]
Отладчик тебе для чего дан?
← →
trxnet © (2010-01-11 20:50) [12]Чтобы работу отлаживать)) А откуда она возмется то работа, если нечего не работает))
В по делу, эквивалент в Delphi:
\0 - тут какой ?
\n -#13
\r -#10
← →
Anatoly Podgoretsky © (2010-01-11 20:52) [13]> trxnet (11.01.2010 20:50:12) [12]
По образцу и подобию получается, что #0
← →
test © (2010-01-11 20:55) [14]trxnet © (11.01.10 20:50) [12]
\0 он и есть 0. Может тебе пересмотреть код? Посмотри TStream и классы производные от него, там по мойму было все что тебе надо, прием передача по сети исходный код можно посмотреть в Indy.
← →
Демо © (2010-01-11 21:10) [15]
> trxnet © (11.01.10 14:58)
А почему у тебя не согласован протокол?
Намного логичнее решить вопрос с приведением в единую кодировку до передачи данных.
← →
trxnet © (2010-01-11 21:33) [16]Потому что клиент сторонний) test, за наводку спасибо. Нашел :)
← →
Dimka Maslov © (2010-01-12 12:25) [17]Управляющие символы тоже закодированы в юникоде.
← →
test © (2010-01-12 15:51) [18]Dimka Maslov © (12.01.10 12:25) [17]
Ему TStream либо все перегонит либо ничего, так что пока он с этой ситуацией не столкнется, тем более что ему в [0] уже об этом сказали.
← →
trxnet © (2010-01-13 02:07) [19]Эх, ничего не вышло... Процедура так которую я отыскал оказывается вовсе этим не занимается(
test, а если буфер перегнать в MemoryStream из него в String а потом, опять в MemoryStream и в из него в буффер?
На самом деле я реализую в проге конвертер мыла, т.е клиент запрашивает письмо с сервера, письмо в любой кодировке, моя прога его декодит в UTF8 и отправляет клиенту, т.к клиент понимает только юникод и использовать нужно именно этот клиент! Я реализовывал через String (вобщето через String все замечательно работает и работало с другими клиентами, но не с этим). Послал письмо через прогу, заголовок в нем закодирован в UTF8 как надо, но клиент выдает кракозябры. Решил проверить правильно ли я закодировал. Взял письмо с UTF8 кодировкой, подключил клиент напряму к серверу и получил нормальное читаемое письмо в клиенте. Посмотрел "код" письма и удивился: Заголовок который я кодировал с помощью моей проги, совпадает с тем, что клиент получил с мейл-сервера напрямую. Как ни шаманил не знаю почему он себя так ведет. Сразу подумал на управляющие символы... Возможно это не так. Может есть у кого какие мысли?
← →
Германн © (2010-01-13 02:24) [20]
> trxnet © (13.01.10 02:07) [19]
>
> Эх, ничего не вышло... Процедура так которую я отыскал оказывается
> вовсе этим не занимается(
>
Ещё один выпускник кулинарного техникума, которого заставили заниматься программированием?
← →
trxnet © (2010-01-13 11:32) [21]Не кулинарного техникума, а техникума здорового питания)) Ну все таки есть че-нить путное ?
← →
Сергей М. © (2010-01-13 12:10) [22]
> trxnet © (13.01.10 11:32) [21]
> есть че-нить путное ?
"Путное" будет после того как ты сподобишься пояснить, откуда у тебя взялся этот несуразный код и какие конкретно сокетные компоненты ты используешь ..
← →
Anatoly Podgoretsky © (2010-01-13 17:26) [23]> trxnet (13.01.2010 11:32:21) [21]
Только в техникуме не научили готовить здоровую пищу.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.05 c