Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2010, 19:58   #1
TzX
Пользователь
 
Аватар для TzX
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию Сокеты в Delphi 2009

В Delphi 7 создал проект использующий TServerSocket и TClientSocket, он отлично работал. После перехода на Delphi 2009 текст, передаваемый по принципу
PHP код:
 Socket.SendText('текст'); 
на сторону сервера (клиента) стал приходить непонятными символами. Где-то читал что это из-за проблем с кодировкой, и проще перейти на WinSoc, но проект довольно таки большой, и не хотелось бы отказываться от использования данных компонентов. Помогите решить проблему. Заранее спасибо за ответ.
TzX вне форума Ответить с цитированием
Старый 09.02.2010, 20:07   #2
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

В Delphi 2009 Unicod, а в 7 версии - ANSI, поэтому вам нужно просто перевести полученный код в ANSI. В гугле полно ответов как это сделать
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 09.02.2010, 20:10   #3
TzX
Пользователь
 
Аватар для TzX
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию

А может наоборот, перед отправкой в Юникод?
TzX вне форума Ответить с цитированием
Старый 09.02.2010, 20:37   #4
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Текст который отправляете переведите в ANSI
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 09.02.2010, 20:39   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Сталкивался с такой проблемой. Мой совет - пользуйтесь WinSock.
profi вне форума Ответить с цитированием
Старый 09.02.2010, 20:59   #6
TzX
Пользователь
 
Аватар для TzX
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию

ВинСок использовать не могу.

Перед отправкой перекодировал такой функцией

PHP код:
function WideStringToString(const wsWideString): AnsiString;
var
  
linteger;
begin
  
if ws '' then
    Result 
:= ''
else
  
begin
    l 
:= WideCharToMultiByte(CP_ACP,
      
WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
      @
ws[1], -1nil0nilnil);
    
SetLength(Result1);
    if 
1 then
      WideCharToMultiByte
(CP_ACP,
        
WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
        @
ws[1], -1, @Result[1], 1nilnil);
  
end;
end
Про получении на другой стороне Вылетают китайские иероглифы. Либо функция не работает, либо опять я что-то....
TzX вне форума Ответить с цитированием
Старый 09.02.2010, 21:01   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Если память не подводит, то:

1. Простое преобразование и так катит - AnsiString(WideString);
2. Кто мешает отправлять Unicode ? Просто на стороне сервера получайте Unicode, а не ANSI (т.е. обработка приема изменится немного)

Проблема в чем именно ?
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2010, 21:18   #8
TzX
Пользователь
 
Аватар для TzX
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию

2 BOBAH13
Как будет происходить обработка приема если делать всё в Юникоде, пример можно?

2 ALL
При Получении пробовал примерно так
PHP код:
 Clientsay:=Socket.ReceiveText;
 
LogMemo.Lines.Add(ANSIString(Clientsay)); 
Теперь в Мемо вместе Иероглифов знаки вопроса

И еще, у меня все переменные типа String, может что то нужно в WideString или UnicodeString в 2009 есть и такие типы данных
TzX вне форума Ответить с цитированием
Старый 09.02.2010, 21:23   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1. Если сервер и клиент откомпилированы в Unicode версии Delphi (RAD and etc.)
2.
Код:
(ANSIString(Clientsay));
Зачем ?
3. Clientsay - это WideString (ну простой String в Unicode ver.) ?
4. Сам не помню уже, Socket.ReceiveText - возвращает Unicode строку ? Если нет, шлите буфер, и читайте буфер, а не текст.
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2010, 21:31   #10
TzX
Пользователь
 
Аватар для TzX
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию

Цитата:
2.
Код:
(ANSIString(Clientsay));
Зачем ?
Хм, Клиент откомпилирован в юникод версии Delphi, вот и была мысль, что шлет юникод.

Цитата:
3. Clientsay - это WideString (ну простой String в Unicode ver.) ?
Просто String, пробовал WdieString - итог один

Цитата:
4. Сам не помню уже, Socket.ReceiveText - возвращает Unicode строку ? Если нет, шлите буфер, и читайте буфер, а не текст.
Вот на счет того в какой кодировке с сокета забирает не знаю....
TzX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сокеты в Delphi god110 Работа с сетью в Delphi 13 08.09.2009 11:20
Delphi 2009 guffer Софт 10 25.08.2009 17:32
Delphi 2009 Yar Свободное общение 1 22.06.2009 20:15
Сокеты в Delphi Necro Работа с сетью в Delphi 11 24.04.2007 07:32