LINUX.ORG.RU

Про Free Pascal Compiler и юникод в GNU/Linux'е

 , ,


1

4

Здравствуйте, любители юникода.

Довольно часто в обсуждениях мне приходилось видеть утверждение, что надо пользоваться языками программирования с встроенной поддержкой юникода. В пример приводился, например, Rust.

Однако, Rust слишком моден и молодёжен. Хочется чего-то более проверенного временем. И решил я тут посмотреть как с поддержкой юникода у Free Pascal Compiler'а. То, что эта поддержка есть, было видно по документации, но по всей этой документации, статьям, сообщениям на форумах и практической работе складывалось впечатление, что эта поддержка только поверхностна, и всё равно придётся работать с отдельными байтами. Вероятно, многие кто с этим сталкивался думают также. Однако, решение есть! Чтобы его откопать мне пришлось много всего перелопатить, но я его нашёл.

program strutftest;
    {$codepage UTF8}
    uses cwstring;
var
        s1: UnicodeString;
        s2: UnicodeString;
begin
  s1 := 'линуксоиды';
  s2 := Copy(s1, 1, 6);
  writeln(s2);
  s2 := 'т' + Copy(s1, 4, 3);
  writeln(s2);
  s2 := UTF8String(#$CE#$B1#$CE#$B2#$CE#$B3#$CE#$B4);
  writeln(s2);
  writeln(pos('ксоид', s1));
  s2 := Copy(s1, 1, 6);
  delete(s1, 1, 6);
  insert('гуман', s1, 1);
  insert(' тоже любят ', s1, 10);
  insert(s2, s1, 22);
  writeln(s1);
end.
Компилируем, запускаем:
$ ./strutftest
линукс
тукс
αβγδ
5
гуманоиды тоже любят линукс
Как видно, строки
    {$codepage UTF8}
    uses cwstring;
в начале исходника включают в FPC юникод во все поля, и стандартные функции Паскаля для работы со строками начинают работать именно с юникодом, а не с отдельными байтами.

★★★★★

Ответ на: комментарий от RazrFalcon

В С/С++ макросы тоже не часть языка.
Все макросы раскрываются препроцессором до вызова компилятора.

bormant ★★★★★
()
Ответ на: комментарий от saahriktu

это хороший стиль программирования

Это артефакт убогих компиляторов, которые по другому не могут. Как и требование определённого порядка определения функций, например.

quantum-troll ★★★★★
()
Ответ на: комментарий от RazrFalcon

man cpp

gcc -save-temps -c main.c -o main.o

Смотри выхлоп в main.i, а выхлоп as в main.s

anonymous
()
Ответ на: комментарий от anonymous

Для бинарных данных хорошо подходит RawByteString

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

Napilnik ★★★★★
()
Ответ на: комментарий от quantum-troll

Каждый воспринимает как хочет.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от Virtuos86

Не в курсе, как с такой проблемой справляются ЯП, в которых строки по умолчанию юникодные?

На них просто не пишут многие типы программ. Паскаль же универсальный ЯП.

Это прекрасно. Не знаю, как в Java, но в питоне, например, для бинарных данных есть отдельный тип байтовых строк. И обычно ты знаешь, с чем имеешь дело, а не

И здесь есть. И это не прекрасно. Каждый новый тип строк это огромная нагрузка на их внедрение и поддержку. Если всё дублировать, то ПО разбухнет.

ССЗБ

ССЗБ, это писать что-то сложное на ЯП, которое не даёт использовать стандартные фичи ни для чего кроме одной разрешённой где-то далеко задачи.

Napilnik ★★★★★
()
Ответ на: комментарий от saahriktu

Так целочисленные типы, включая типы Byte и Word, никто же не отменял. Бинарную информацию можно хранить в массивах этих типов.

А строки можно складывать, искать встроенными средствами в них куски, отправлять на печать в консоль, присваивать значение сразу всей строке целиком не запаковывая для этого тип массива в дополнительный тип данных. И в них индекс начинается с единицы а не с нуля, как в массивах переменной длины. Строки местами удобны. Раз такой функционал есть, то зачем его портить?

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

Ну, если в каком-то софте нужен именно такой функционал, то почему бы и нет.

А если так работать с бинарными данными нет необходимости, зато есть необходимость так работать именно с текстовыми строками в юникоде, то можно и юникод во все поля включить.

То, что есть выбор, это, конечно, хорошо.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от quantum-troll

артефакт убогих компиляторов, которые по другому не могут

Это вы, стесняюсь спросить, про компиляние в 100500-й раз очередного стандартного заголовочного файла? Так тут специально прекомпилированные заголовки завезли, можно не каждый раз компилять, а один раз на каждое изменение набора стандартных заголовков внутри проекта. Несомненный прогресс.

требование определённого порядка определения функций

Объявления, не определения. Откройте для себя forward. Откройте для себя модули.
Кроме того, вон, Си не требует особого порядка, однако же зачем-то пишут кучу #include, странные какие-то.

bormant ★★★★★
()
Ответ на: комментарий от RazrFalcon

Шта?!

Возьмите букварь, букварь сам себя не прочитает, мы подождем.

Тараписса не нада. (q)

О сколько нам открытий чудных
Готовят просвещенья дух
И опыт, сын ошибок трудных,
И гений, парадоксов друг,
И случай, бог изобретатель.
(q) А.С.Пушкин

bormant ★★★★★
()

В fpc 3 были большие изменения по работе с юникодом и кодировками. Теперь там все гораздо легче. Правда инфу как работать со строками по новому непросто сходу найти

http://wiki.freepascal.org/Unicode_Support_in_Lazarus/ru

http://wiki.lazarus.freepascal.org/FPC_Unicode_support/ru

Поэтому надо взять послендий Лазарус и посмотреть что и как

ism ★★★
()
Последнее исправление: ism (всего исправлений: 1)
Ответ на: комментарий от bormant

Что сказать-то хотели? То, что макросы раскрываются на определенной стадии компиляции не делает их частью языка?

RazrFalcon ★★★★★
()

Тэкс, это правда топик, в котором саахрикту рассказывает, как заюзать юникод в коде?

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

Не просто «заюзать юникод», а «включить юникод во все поля» и разбирать текстовые строки в юникоде стандартными строковыми функциями.

Просто работать с юникодными строками без их разбора и модификаций, как выясняется, можно и без включения юникода во все поля.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)

Прямо-таки не верится!

Кто-то явно угнал у saahriktu аккаунт, потому как ну не может у него быть про паскуалий, а уж тем паче — про хрюникод!

anonymous
()
Ответ на: комментарий от anonymous

Я всегда хорошо относился к Паскалю. Собственно, изучать программирование я начал ещё с этой книги - https://coollib.com/sites/default/files/cover_50.jpg -, которая у меня появилась когда мне было лет 10. Это уже потом я втянулся в Basic, а потом через Паскаль перескочил в C так почти ничего и не написав на Паскале. Однако, про Паскаль я всегда помнил. Собственно, тремя основными языками программирования на мой взгляд всегда были, есть и будут именно Basic, Pascal и C.

Да и юникод не так уж и страшен. Просто не всегда есть смысл его использовать, да. В иксах/вейланде есть.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от anonymous

Pascal - замшелое говно.

а мне нравится. Удобно писать на нам. Си слишком мутный и очень легко прострелить себе ногу. Особенно в работе с памятью.

dikiy ★★☆☆☆
()
Ответ на: комментарий от saahriktu

Pascal давно вышел из употребления и находится на свалке истории. На которой вы копаетесь. Может, и найдёте что-то интересное для вас, но ничего реально полезного. Я программировал на Pascal когда-то давно, бросил, когда это потеряло смысл (тоже давно).

Также и Basic. Некоторое применение ещё имеют VB.Net (реально не нужен) и VBA.

Basic сейчас заменён на Python (в качестве простого языка для непрофессиональных программистов. Если Pascal интересовал в этом качестве, то Python заменяет и его. Но Python не так уж редко бывает нужен и профессиональным программистам ).

Так что вам есть смысл самостоятельно разведать, какие языки популярны сейчас и каковы их области применения. Среди популярных языков вы с удивлением не обнаружите Pascal и Basic.

Partisan ★★★★
()
Ответ на: комментарий от Partisan

Всё зависит от решаемых задач. Если нужно решать какие-то специфические веб-задачи, то без новых языков может быть сложно. А обычный софт, который просто локально (или не совсем локально) гоняет байты, может быть написан на чём угодно. Просто в последнее время его чаще всего пишут на C/C++. Однако, он может быть и на Паскале, может быть и на Фортране (на Фортране, кстати, написаны части numpy и scipy), может быть и на том или ином диалекте Basic'а, может быть на Delphi/Lazarus,... и т.д.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

★★★★★

Про cpp не занет лол

anonymous
()
Ответ на: комментарий от anonymous

С - язык для микроконтроллеров.

Ты сидишь на системе которая на 90% написана на сях лол.

anonymous
()
Ответ на: комментарий от Partisan

Pascal давно вышел из употребления и находится на свалке истории.

Что мля? Паскаль жив в подобных ему языках типа ST, SCL. Используются во всех современных ПЛК.

AUX ★★★
()
Ответ на: комментарий от anonymous

Кошернее си только Go и Limbo. Но на микроконтрллерах сишечка без вариантов.

AUX ★★★
()

надо пользоваться языками программирования с встроенной поддержкой юникода. В пример приводился, например, Rust.

не-не, в пример приводился Swift

Einstok_Fair ★★☆
()
Ответ на: комментарий от dikiy

Си слишком мутный и очень легко прострелить себе ногу

Еще раз - прекратите писать на языке для ядра и мк что-либо отличное от этих задач.

anonymous
()
Ответ на: комментарий от anonymous

Над строками куча народа пыхтела, чтобы вписать их в железо, а ты предлагаешь на этот труд забить. Банально, может понадобиться к строке текста форматирование навесить, а делать это лучше символами, которые текстом не используются. И тут - бац, у нас получилась строка с бинарным содержимым!

Самое частоиспользуемое и простое:

A:='ЙЦУКЕН'+#32+'12345'+#13#10+'Траляля!';

Napilnik ★★★★★
()
Последнее исправление: Napilnik (всего исправлений: 1)
Ответ на: комментарий от dikiy

Ну может если с С сравнивать...

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

vertexua ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.