Редактирование исходников в utf-8(открываем новые гориз

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

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

Редактирование исходников в utf-8(открываем новые гориз

Сообщение Cheb » 10.06.2007 03:38:54

Итак, что нам надо прежде, чем мы начнём?.. Нам надо пересобрать IDE Лазаруса под GTK2 (по умолчанию она работает под GTK1). Для сей операции надо : а). Запустить Лазаря под root'ом, и б). Скрестить пальцы.
Если всё проходит удачно, вы становитесь обладателем GTK2-шного Лазаря. Что в нём есть хорошего, кроме пакета бесплатных глюков, отвратительно размытых шрифтов в редакторе и отвратительно разбухших шрифтов в меню?.. Он - полностью юникодный, и кодировка utf-8 для него родная. Теперь вы (вставив в начале программы директиву {$codepage utf-8} ) можете совершенно спокойно вставлять в программу русские строки, и плевать, плевать, ПЛЕВАТЬ, поддерживает система русский язык или нет.

Но что-то я отвлёкся.
Предположим, написали вы нечто прочувствованное, вроде
Код: Выделить всё
function Swear: string;
begin
  Result:='Весь мир - 糞 です!';
end;

и получаете в результате... Хрен с бубликом вы получаете. Ибо засада тут в том, что такие вот строковые константы компилятор перегоняет... Нет, не в Utf8String, как вы могли бы подумать! Он перегоняет их в WideString! И при попытке впихнуть в AnsiString делает то, что обычно делает с русским текстом при подобном преобразовании - т.е. превращает в мокрое место.

Так что, вышеописанную функцию придётся поправить на WideString. И везде, где у вас объявляется переменная-константа, задавать ей тип WideString.

Вот. Одну засаду я нашёл. Кто-нибудь знает об ещё каких-нибудь?

З.Ы. Как укротить GTK2 я доискался-таки (а под KDE задача оказалась нетривиальной). Надо взять файл /usr/share/themes/<ваша любимая тема>/gtk-2.0/gtkrc , скопировать его в /home/<юзер>/gtkrc-2.0 (ибо, по закону подлости, этого файла там обычно нет), и добавить в начало строчку типа
gtk-font-name = "Verdana 8"
- всё, монстр укрощён, опухшие менюшки в Лазаре сдулись (особенно если выбрать тему Redmond95). Заодно оказываются укрощёнными и Файрфокс, и ДЦ++, и Крусадёр... Много кого. 8)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение debi12345 » 10.06.2007 12:49:51

Опцию компилятора "-Fcutf8" пробовали ?

MSEgui с этой опцией прекрасно собирает проекты с utf8-константами.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Cheb » 10.06.2007 13:11:02

Опцию компилятора "-Fcutf8" пробовали ?

Насколько я знаю, это то же самое, что {$codepage utf-8} в самом коде.

Да, я ея добавляю (см. выше). И компилятор понимает исходники в utf-8.
Вот только константы он на основе этого кода генерирует типа WideString.
*Не* Utf8String.

Поэтому вместо
Код: Выделить всё
Writeln('Ё');


приходится писать
Код: Выделить всё
WriteLn(Utf8Encode('Ё'));

- только тогда в utf-8-нутой линуксятине текст в консоль будет выведен правильно.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Sergei I. Gorelkin » 10.06.2007 13:31:55

Может тогда наоборот, надо без {$codepage utf-8} работать? Тогда, по идее, компилятор не должен как-либо строку преобразовывать, и должна получиться AnsiString в utf-8 кодировке.
Хотя наверняка при этом еще какая-нибудь засада вылезет...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение debi12345 » 10.06.2007 13:53:51

WideString.
*Не* Utf8String.


Так и работайте с WideString !
Я с ними беды не знаю. Уже и забыл такое слов, как "кодировка".
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Cheb » 11.06.2007 02:12:54

Так и работайте с WideString !

Я и работаю (и это правильно). Но.
Ну, например... Если надо в TStringList хранить, то надо не забывать вручную, через Utf8Encode/Utf8Decode пропускать.

Может тогда наоборот, надо без {$codepage utf-8} работать? [...] Хотя наверняка при этом еще какая-нибудь засада вылезет...

Вообще, идея интересная. Но а если в "окрякозябленном" виде байт, равный апострофу, попадётся?
Плюс, с включённой директивой компилятор умеет выдавать ошибку "Malformed utf-8 string".

P.S. А вообще, надо посмотреть как стандартный конвертер Wide <-> Ansi устроен, и вставить туда обёртки с utf8Encode/Utf8Decode. Тогда точно все проблемы исчезнут.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение tria » 11.06.2007 14:19:59

На всякий случай добавлю одно наблюдение.
Лазарус GTK1, UTF8.
Если установить кирилический шрифт и указать его в настройках редактора, то русский текст cp1251 нормально отображается и отрабатывается компилятором.
Однако перед выводом конвертировать надо...
Я сейчас с этим вопросом разбираюсь.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Cheb » 12.06.2007 00:26:30

Если установить кирилический шрифт и указать его в настройках редактора, то русский текст cp1251 нормально отображается и отрабатывается компилятором.

Отображается-то да. А вот вводить - шиш. Или игнорирует ввод, или крякозябли вставляет.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 35

Рейтинг@Mail.ru