PDA

Просмотр полной версии : [Помогите!] Юникод в XE5


NebesaBag
15.04.2014, 18:33
Здравствуйте.
Есть проект на D7, в котором имеются Edit с заполненным русским текстом.
Начал переносить код на XE5(в дальнейшем под андроид написать есть желание приложение), но тк в версиях Delphi 9+ есть поддержка юникода, то возникла проблема.
Русский текст при записи из компонента в переменную, при перекодировании StrToHex, выдаёт совсем другие значения, не совпадающие со значениями в D7.

Utf8Decode/Encode пробовал, не помогло.

Есть способы решить данную проблему?)

Sinyss
15.04.2014, 19:23
в дальнейшем под андроид написать есть желание приложение
Хочешь писать под андроид - пиши на Java.

NebesaBag
15.04.2014, 20:11
Надеюсь тут появятся комментарии по теме)

Dinmaite
15.04.2014, 22:19
Много раз ведь говорили. Хотите ответ? Кидайте свой код.
Ибо не ясно какую конкретно функцию вы использовали.

NebesaBag
15.04.2014, 22:42
Извиняюсь, вот код:

data.Add('login='+LabeledEdit1.Text);
data.Add('password='+LabeledEdit2.Text);

Id[Ссылки могут видеть только зарегистрированные и активированные пользователи]('[Ссылки могут видеть только зарегистрированные и активированные пользователи]', data);


Логин может быть на двух языках. Данный образец кода в 7 делфи работает без сбоев. В XE5 посылает совсем другие байты у логина(думаю из-за поддержки юникода).

Рэйзор
16.04.2014, 06:27
Раз у Вас стоит XE5 то можно воспользоваться последними исправлениями в инди и использовать TIdMultipartFormDataStream вместо TStringList
пример:

data := TIdMultipartFormDataStream.Create;
data.AddFormField('login', LabeledEdit1.Text, 'utf-8');

Если нужно убрать quoted-printable, то надо установить тип содержимого:

data.AddFormField('login', LabeledEdit1.Text, 'utf-8').ContentTransfer := '8bit';

NebesaBag
16.04.2014, 13:13
Раз у Вас стоит XE5 то можно воспользоваться последними исправлениями в инди и использовать TIdMultipartFormDataStream вместо TStringList


Подскажите как вывести подобное showmessage(String(StrToHex(data[0]))); ?
Чтобы я мог проверить что записано в данной ячейке.

Рэйзор
17.04.2014, 07:17
Подскажите как вывести подобное showmessage(String(StrToHex(data[0]))); ?
Чтобы я мог проверить что записано в данной ячейке.

это поток, из него так просто не вытащить уже.
Я давно на делфи не писал - так что не знаю, мб и можно.
И по поводу функции StrToHex - мб стоит использовать AnsiStrToHex : [Ссылки могут видеть только зарегистрированные и активированные пользователи]

NebesaBag
17.04.2014, 10:50
StrToHex я использую лишь для того чтобы без снифера сразу видеть правильность данных.
Увы, с TIdMultipartFormDataStream вместо "login=1&pass=2" шлётся много других не нужных параметров.
Возможно есть способ решения проблемы без этого компонента?

Рэйзор
17.04.2014, 11:18
StrToHex я использую лишь для того чтобы без снифера сразу видеть правильность данных.
Увы, с TIdMultipartFormDataStream вместо "login=1&pass=2" шлётся много других не нужных параметров.
Возможно есть способ решения проблемы без этого компонента?

Эти данные будут нормально обработаны любым веб сервером.

Есть вариант в виде моего старого компонента:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

компонент визуальный - после установки искать во вкладке Internet

примеры:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Использовать TStringList не стоит - так как там проблемы со склейкой.
Лучше просто строку передавать со склейкой через & как в одном из примеров:

s := [Ссылки могут видеть только зарегистрированные и активированные пользователи]('[Ссылки могут видеть только зарегистрированные и активированные пользователи]', 'user=ololoev&pass=123456');

NebesaBag
17.04.2014, 12:16
Спасибо, только я боюсь что Ваш компонент также будет получать юникодные значения русских символов, что в итоге не приведёт к успешной авторизации(

Сейчас вопрос в том как можно без юникодных обработок получить русские символы, подобно Д7

Рэйзор
17.04.2014, 12:20
Спасибо, только я боюсь что Ваш компонент также будет получать юникодные значения русских символов, что в итоге не приведёт к успешной авторизации(

Сейчас вопрос в том как можно без юникодных обработок получить русские символы, подобно Д7


в том то и дело, что он специально для этого и был написан.
никаких обработок не нужно.
Там везде AnsiString используется.
+ возможность инициализации с нужным экземпляром класса TEncoding