Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Кодировка


Автор: MrDmitry 7.9.2011, 15:18
Помогите разобратся с кодировкой. Выполняю запрос

Код

 function TMains.registration(http, key, phone, name, surname, patronamic, birth:string):string;
var
 data: TIdMultiPartFormDataStream;
begin
 data := TIdMultiPartFormDataStream.Create;
  try
     mains.IdHTTP1.get(http+'action=2&session_key='+key+'&phone='+phone+'&name='+name+'&surname='+surname+'&patronymic='+patronamic+'&birth='+birth);
  finally
    data.Free;
  end;
  end;

...

registration(http, sesion_key, phone_news, name_new.Text, surname_new.Text, patronymic_new.Text, dates);



сайт в кодировки utf-8

В базу данных заносятся ??? за место русских символов ((  Перепробовал уже множество различных кодировок, нашел кучу разных функций но ни что мне не помогло (((

Автор: ZBugz 7.9.2011, 19:49
Код

function TMains.registration(http, key, phone, name, surname, patronamic, birth:string):string;

Пробуй string на WideString поменять, раз ты с UTF8 работаешь, иначе смысла в этом UTF8 нету.

Автор: MrDmitry 8.9.2011, 11:24
Не помогло

Автор: MetalFan 9.9.2011, 15:09
Версия делфи какая?
ааа... так в url надо HTTPEncode из HTTPApp какой-нибудь делать для русских символов. Ну или TIdURI.URLEncode, если indy используешь.

Автор: MrDmitry 11.9.2011, 15:04
Цитата(MetalFan @ 9.9.2011,  15:09)
Версия делфи какая?
ааа... так в url надо HTTPEncode из HTTPApp какой-нибудь делать для русских символов. Ну или TIdURI.URLEncode, если indy используешь.

Использую indy версия дельфи 2010

Автор: ZBugz 11.9.2011, 18:41
Цитата(MrDmitry @ 8.9.2011,  11:24)
Не помогло

Тогда попробуй RawByteString, должно вернуть то что есть полюбому, хотя WideString тоже точно работать должен.

Автор: MrDmitry 11.9.2011, 19:16
Теперь за место ??? в бд записывается фф

Добавлено через 1 минуту и 16 секунд
Цитата(ZBugz @ 11.9.2011,  18:41)
Цитата(MrDmitry @ 8.9.2011,  11:24)
Не помогло

Тогда попробуй RawByteString, должно вернуть то что есть полюбому, хотя WideString тоже точно работать должен.

проблема в том что у меня возвращается нормально. А вот записывается в бд не правильно. Если я в бд в ручную изменю данные на русские символы то возвращается как надо и со string

Автор: ZBugz 11.9.2011, 19:56
Цитата

проблема в том что у меня возвращается нормально. А вот записывается в бд не правильно.

Дык это пробелма в БД уже, раз функция возвращает все верно.
Пиши код БД чтоли...
Цитата

Теперь за место ??? в бд записывается фф

Это уже потому что в БД не понимает RawByteString. Единственyое что мона попробывать это привести к String (ANSI) принудительно в самой БД или при передачи в нее.

Добавлено через 4 минуты и 12 секунд
Вот такой с такой же проблемой я боролся с cmd (он же paramstr), там до сих пор ansi используется, только мне из Ansi в Unicode надо было перевести. Пришлось извратится:
Код

var
  FStr: RawByteString;
begin
  AnsiToUtf8(FStr);
  SetLength(FStr, Msg.CopyDataStruct.cbData);
  move(pointer(Msg.CopyDataStruct.lpData)^, FStr[1], Length(FStr));

Иначе тоже получал белеберду.

Автор: MrDmitry 11.9.2011, 20:14
Код самой бд я не знаю, т.к её разрабатывал не я и прямого доступа к ней у меня нет, все что есть это транзакция вида 

http://mysayte.ru/index.php?action=2&session_key=111111111111111111111&phone=11111111111&name=тест&surname=тест&patronymic=тест&birth=01.01.1901



Сайт и сама бд mysql в кодировки utf-8
поля name, surname, patronymic - utf8_general_ci

Добавлено через 4 минуты и 32 секунды
Цитата(ZBugz @ 11.9.2011,  19:56)
Цитата

проблема в том что у меня возвращается нормально. А вот записывается в бд не правильно.

Дык это пробелма в БД уже, раз функция возвращает все верно.
Пиши код БД чтоли...
Цитата

Теперь за место ??? в бд записывается фф

Это уже потому что в БД не понимает RawByteString. Единственyое что мона попробывать это привести к String (ANSI) принудительно в самой БД или при передачи в нее.

Добавлено @ 20:00
Вот такой с такой же проблемой я боролся с cmd (он же paramstr), там до сих пор ansi используется, только мне из Ansi в Unicode надо было перевести. Пришлось извратится:
Код

var
  FStr: RawByteString;
begin
  AnsiToUtf8(FStr);
  SetLength(FStr, Msg.CopyDataStruct.cbData);
  move(pointer(Msg.CopyDataStruct.lpData)^, FStr[1], Length(FStr));

Иначе тоже получал белеберду.

твой код ругается на CopyDataStruct. Что нужно дописать в uses?

Автор: MrDmitry 11.9.2011, 22:21
В общем сделал банальный перевод русских символов на транслит. 


Спасибо всем за помощь

Автор: ZBugz 12.9.2011, 07:29
Цитата

твой код ругается на CopyDataStruct. Что нужно дописать в uses? 

Это кусок кода, там это дал для смысла...
Цитата

Сайт и сама бд mysql в кодировки utf-8
поля name, surname, patronymic - utf8_general_ci

Видимо передача просиходит через Dll,  а он судя по всему тока ansi понимает. Кстати распространенная проблема с dll, если писал кто нить давно или она стороняя и не поддердивается больше. 

Цитата

В общем сделал банальный перевод русских символов на транслит. 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)