Как написать простейшее unicode-приложение?

Вопросы программирования и использования среды Lazarus.

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

Как написать простейшее unicode-приложение?

Сообщение postscripter » 01.06.2012 03:17:57

Собственно, сабж. При стандартных настройках, на форму нельзя ввести символы из unicode. При добавлении в "параметры" проекта ключа -Fcutf8, зачем-то сразу же перекомпилируются все-все-все модули, доходит до компонентов indy и останавливается с ошибкой - "строка не является строкой utf8", или как-то так... При добавлении этого ключа в параметры сборки самого лазаруса, та же ошибка, но в других, служебных юнитах.

Как правильно делать?

Добавлено спустя 4 минуты 27 секунд:
Я, собсно, лазарус-то установил только за этим - пишу программу для работы с мультиязычным сайтом. Были варианты - либо скачать delphi xe2 (2,3 ГБ), либо Lazarus (80мб). Здравый смысл победил :mrgreen:
Последний раз редактировалось postscripter 01.06.2012 10:20:26, всего редактировалось 1 раз.
postscripter
новенький
 
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Re: Как написать простейшее unicode-приложение?

Сообщение Максим » 01.06.2012 04:23:40

postscripter писал(а):При стандартных настройках, на форму нельзя ввести символы из unicode.

Да ладно?

Версия Lazarus какая? Что понимается под "ввести на форму символы из unicode"?
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Как написать простейшее unicode-приложение?

Сообщение postscripter » 01.06.2012 10:19:35

Имеется в виду - ввести в TEdit что-нибудь типа 世界您好!
Версия 0-9-30-4 i386/win32

Алсо SizeOf(char) по-прежнему - единица. так и должно быть?

Добавлено спустя 17 минут 6 секунд:
mystring[0] выдаёт первый символ строки, а mystring[1] - второй! Что за????

Добавлено спустя 9 минут 36 секунд:
Что значит галочка "использовать строки анси" в параметрах компиляции? Она сейчас включена. И была включена. Тем не менее, в строке из трёх русских букв mystring[-4] показывает шесть.....
postscripter
новенький
 
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Re: Как написать простейшее unicode-приложение?

Сообщение FedeX » 01.06.2012 13:48:29

В Лазарус используется UTF8 а не UTF16 как в Делфи, так что SizeOf(char) единица - нормально. А насчёт невозможности ввода символов в редакторе форм - возможно проблема шрифтов
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Как написать простейшее unicode-приложение?

Сообщение postscripter » 01.06.2012 14:16:05

Ааа... :oops: и правда))) Arial Unicode MS форева. Спасибо! Но что с индексами такое творится?? почему строки нумеруются с нуля?
postscripter
новенький
 
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Re: Как написать простейшее unicode-приложение?

Сообщение v-t-l » 01.06.2012 14:27:29

Киньте на форму TEdit, TComboBox и добавьте обработчики:
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Text := '世界您好';
  ComboBox1.Items.Clear;
  ComboBox1.Items.AddStrings(Screen.Fonts);
  ComboBox1.Text := Edit1.Font.Name;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Edit1.Font.Name := ComboBox1.Text;
end;

Скроля комбобокс, подберите подходящий шрифт :D .
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Как написать простейшее unicode-приложение?

Сообщение postscripter » 01.06.2012 14:33:47

Да, можно... хотя ариал самый полный из всех, как мне кажется. Так что за ерунда с индексами? Это нормально? Меня это больше беспокоит...
postscripter
новенький
 
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Re: Как написать простейшее unicode-приложение?

Сообщение SSerge » 02.06.2012 06:05:21

postscripter писал(а):Так что за ерунда с индексами? Это нормально?


вот это прочитайте: http://sirserge.altai.info/articles/?id=41 , там наглядно показано, почему и как можно. Вкратце: при работе со строками, содержащими в себе UTF8, вы вообще не имеете права использовать индексацию элементов строки, как массива.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Как написать простейшее unicode-приложение?

Сообщение postscripter » 02.06.2012 15:31:24

А если мне нужна байтовая репрезентация строки? Начинать с нуля, или с единицы? Приведу пример...

Код: Выделить всё
function urlencode(s:string):string;
var
i:integer;
begin
result:='';
for i:=1 to length(s) do
  begin
   if s[i] in [' '] then result:=result+'+' else
    if s[i] in ['a'..'z','A'..'Z','0'..'9','!','?','-','.'] then result:=result+s[i] else
    result:=result+'%'+inttohex(byte(s[i]), 2);
  end;
end;


Функция отрабатывает, всё хорошо. Из слова "Привет" получается %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82 Можно проверить, всё правильно, так и должно быть: yandex.ru/yandsearch?text=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82

А теперь сам прикол - в отладчике по ctrl+F7 первый байт строки, который я считываю как "s[1]", равен не D0, а 9F! А D0 - это байт с индексом s[0], опять же, в отладчике. Но в цикле я не читаю нулевой байт, я начинаю с первого! И по логике, этот код работать не должен. Но работает. Непонятно откуда же взялся D0, если он, якобы, находится в нулевой позиции, и я его вроде как не считываю???
postscripter
новенький
 
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Re: Как написать простейшее unicode-приложение?

Сообщение Mr.Smart » 02.06.2012 16:55:29

postscripter, отладчик (GDB) отдельный проект, который создавался и развивается в первую очередь, как отладчик для C/C++. Как известно, что индексы массивов в выше упомянутых языках начинаются с 0. Есть ещё вопросы?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Как написать простейшее unicode-приложение?

Сообщение postscripter » 02.06.2012 17:00:44

Доходчиво :-) Благодарю!
postscripter
новенький
 
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Re: Как написать простейшее unicode-приложение?

Сообщение debi12345 » 02.06.2012 19:01:25

Вкратце: при работе со строками, содержащими в себе UTF8, вы вообще не имеете права использовать индексацию элементов строки, как массива.

100% ! Поэтому работать в памяти с UTF8-строками, и использовать эти строки как свойства и переменные - плохая идея [теряешь самый скоростной функционал] :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Как написать простейшее unicode-приложение?

Сообщение Ism » 02.06.2012 19:54:29

Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Как написать простейшее unicode-приложение?

Сообщение postscripter » 02.06.2012 21:11:20

Не знаю как по скорости, с utf8 раньше не работал. Но делфях операции с обычными строками оптимизированы по самое нехочу, убедился когда писал лабораторную работу "подбор паролей" и сравнивал с ассемблером... В любом случае, альтернативы же нет. Да и пока всё работает замечательно - слова добавляются на forvo.com по 20 штук в минуту. Спасибо всем помогавшим! А если работать перестанет, я знаю куда обратиться :)

Добавлено спустя 2 часа 1 минуту 51 секунду:
Только вот неужели никому кроме меня не действует на нервы привязанность отладчика к си-подобным языкам? Строю дерево из строк, сравниваю a<b. В отладчике - FALSE, на самом деле - TRUE.
postscripter
новенький
 
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Re: Как написать простейшее unicode-приложение?

Сообщение Mr.Smart » 03.06.2012 00:47:16

Строки так не сравниваются. Используем CompareStr,AnsiCompareStr,WideCompareStr или их аналоги с учётом регистра *Text.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 235

Рейтинг@Mail.ru
cron