powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus
25 сообщений из 314, страница 5 из 13
Lazarus
    #39877434
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatТак-то оно так, но чем тогда UTF8String лучше обычного TBytes?
Нафига он такой ущербный нужен?

Используй UTF8Lenght() vs Lenght(), UTF8Pos() vs Pos()... Что-то мешает этому?

Они корректно работают что с UTF8String(AnsiString(CP_UTF8)/RawByteString(AnsiString(CP_NONE)), что co String (которая в винде ведет себя, как 2-байтовая AnsiString, а в линуксе [ если я правильно помню ] - как 1-байтовая).

Еще бы я посоветовал глянуть сюда и сюда . Возможно, это внесет какую-то ясность.
...
Рейтинг: 0 / 0
Lazarus
    #39877503
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
было (Delphi), стало (FPC)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 TempCnt := Min(Length(s1), l);
 for i := 1 to TempCnt do
 begin
  c := s1[i];
  if (c <> '"')
   {and (c <> '''')}//исправил - не было мягких знаков
   and not CharInSet(c, [#0..#9, #11, #12, #14..#20]) then //исправил - не было переносов
   Result := Result + c
  else
   Result := Result + ' ';
 end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 TempCnt := Min(Utf8Length(s1), l);
 for i := 0 to TempCnt - 1 do
 begin
  CPLen := UTF8CodepointSize(p);
  c := p[0];
  if (c <> '"')
   and not CharInSet(c, [#0..#9, #11, #12, #14..#20]) then 
   begin
    SetLength(Result, Length(Result) + CPLen);
    Move(P^, Result[Length(Result) - CPLen + 1], CPLen);
   end;
  Inc(p, CPLen);
 end;



Приходится два кода держать, да и вообще неуднобно.
...
Рейтинг: 0 / 0
Lazarus
    #39877505
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Length возвращает количество элементов , что соответствует поведению массивов, хоть со стороны на первый взгляд и может показаться непривычным.
К тому же, повторюсь, есть очень мало случаев, когда требуется получать именно конкретный кодпоинт. В подавляющем большинстве применений if s[i]='Ы' then ... или if Pos('Гы', s) <> 0 then... или что-то вроде - всё это будет прекрасно работать и без заморочек с плавающими длинами кодпоинтов.
...
Рейтинг: 0 / 0
Lazarus
    #39877509
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonбыло (Delphi), стало (FPC)
Потому что пора бы оторваться от алгоритмов детского сада и копировать кусками
...
Рейтинг: 0 / 0
Lazarus
    #39877513
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonбыло (Delphi), стало (FPC)
Кстати, а в чем вообще проблема? Символы из набора ", #0..#9, #11, #12, #14..#20 заменяются на пробелы, так? Но ведь и составляющие суррогатной пары, и первый байт любого кодпоинта utf8 имеют особые значения, которые не перепутаешь с символами.
...
Рейтинг: 0 / 0
Lazarus
    #39877540
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2makhaonбыло (Delphi), стало (FPC)
Потому что пора бы оторваться от алгоритмов детского сада и копировать кусками

То есть еще существенно усложнить обработку в обоих случаях? Можно. Но результат станет еще хуже. Хоть и работать будет лучше.
...
Рейтинг: 0 / 0
Lazarus
    #39877624
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatТак-то оно так, но чем тогда UTF8String лучше обычного TBytes?
Нафига он такой ущербный нужен?
Ну, например, у codepage aware строк есть COW и поддержка элементарных строковых функций, что может быть полезно при разработке, например, http сервера или клиента (для обработки заголовков не требуется переводить их в юникод-строку только для того чтобы выполнить некоторые проверки).
...
Рейтинг: 0 / 0
Lazarus
    #39877631
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonПриходится два кода держать, да и вообще неуднобно
Что вам мешает использовать UnicodeString в FPC?
...
Рейтинг: 0 / 0
Lazarus
    #39877640
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonПриходится два кода держать, да и вообще неуднобно.
И насколько я понимаю, этот дельфийский код работал бы без переделок даже для Utf8String.
...
Рейтинг: 0 / 0
Lazarus
    #39877719
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonТо есть еще существенно усложнить обработку в обоих случаях? Можно. Но результат станет еще хуже. Хоть и работать будет лучше.
Нет, при использовании фрагментов строк вместо символов код будет один.
Хотя и этот нормально работает на любых строках
...
Рейтинг: 0 / 0
Lazarus
    #39877773
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

авторЧто вам мешает использовать UnicodeString в FPC?
Так еще больше править - код один и пришлось бы все string'и менять на какие-то свои с дефайнами.

авторНет, при использовании фрагментов строк вместо символов код будет один.
Хотя и этот нормально работает на любых строках

Лучше с кодом. Что-то не могу представить как можно сделать один код и для дефолтных string'ов delphi и fpc без дефайнов или как у меня - просто двух кусков кода.
...
Рейтинг: 0 / 0
Lazarus
    #39877781
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonТак еще больше править - код один и пришлось бы все string'и менять на какие-то свои с дефайнами.
Пишешь {$mode delphiunicode} или {$modeswitch unicodestrings}, если нужен диалект fpc, и ничего править не нужно - дефолтные строки становятся юникодовыми.
...
Рейтинг: 0 / 0
Lazarus
    #39877783
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonЧто-то не могу представить как можно сделать один код и для дефолтных string'ов delphi и fpc без дефайнов или как у меня - просто двух кусков кода.
Приведённый тобою дельфийский код одинако работоспособен с любыми типами дефолтных строк.
...
Рейтинг: 0 / 0
Lazarus
    #39877788
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

это да. однако все api в линухе как было utf8 строки, так и останется. ну и придется лепить прокладки. так как я сейчас сделал - получились минимальные правки. когда строки в лазаре станут по дефолту как в делфи, то получится вообще один код.
...
Рейтинг: 0 / 0
Lazarus
    #39877789
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

авторПриведённый тобою дельфийский код одинако работоспособен с любыми типами дефолтных строк.


Увы, не работало. пришлось переписывать. Ну не от хорошей жизни же правил :) Работало бы - нафиг я бы это все трогал.
...
Рейтинг: 0 / 0
Lazarus
    #39877790
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonоднако все api в линухе как было utf8 строки, так и останется. ну и придется лепить прокладки
У тебя там много работы непосредственно с API? Да и какие прокладки, конвертирование строк делается простым приведением типа. К слову, у FPC в RTL многие функции (не все) имеют перегруженные варианты для трёх типов строк: unicode, utf8 и rawbytestring.
...
Рейтинг: 0 / 0
Lazarus
    #39877791
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonУвы, не работало. пришлось переписывать.
Я конечно не проверял, но у тебя там заменяемые символы не выходят из диапазона ASCII. Ни один спец символ используемый для кодирования последовательностей utf8 не будет заменён (т.к. все они имеют старший бит установленный в единицу), следовательно последовательности нарушены не будут.
...
Рейтинг: 0 / 0
Lazarus
    #39877796
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

авторУ тебя там много работы непосредственно с API? Да и какие прокладки, конвертирование строк делается простым приведением типа. К слову, у FPC в RTL многие функции (не все) имеют перегруженные варианты для трёх типов строк: unicode, utf8 и rawbytestring.
Хватает всякого, кода полмиллиона строк.

авторЯ конечно не проверял, но у тебя там заменяемые символы не выходят из диапазона ASCII.
Точно не работало. Впрочем можно попробовать перепроверить. Ну и это не единственное место. Просто относительно простое.
...
Рейтинг: 0 / 0
Lazarus
    #39877813
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кусочки веселушки равномерно рзамазаны по коду:
Код: pascal
1.
2.
  Pos1 := {$IFDEF FPC}UTF8Pos{$ELSE FPC}Pos{$ENDIF FPC}(' ', s);
  Pos2 := {$IFDEF FPC}UTF8Pos{$ELSE FPC}PosEx{$ENDIF FPC}(' ', s, Pos1 + 1);


Везде по чуть-чуть. Общая картина далека от радостной. Но работает :)
...
Рейтинг: 0 / 0
Lazarus
    #39877819
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonКусочки веселушки равномерно рзамазаны по коду:
Код: pascal
1.
2.
  Pos1 := {$IFDEF FPC}UTF8Pos{$ELSE FPC}Pos{$ENDIF FPC}(' ', s);
  Pos2 := {$IFDEF FPC}UTF8Pos{$ELSE FPC}PosEx{$ENDIF FPC}(' ', s, Pos1 + 1);


Везде по чуть-чуть. Общая картина далека от радостной. Но работает :)
Ох ё... мало того что бессмысленно это, ибо и так работает, так еще и сделано максимально коряво. Вместо того, чтобы плодить дефайны, сделали бы NativeStrPos, которая бы мапилась на соответствующую функцию из RTL и всё.
...
Рейтинг: 0 / 0
Lazarus
    #39877823
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2так еще и сделано максимально коряво.
зато, как красиво! В одну строку
...
Рейтинг: 0 / 0
Lazarus
    #39877826
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Ох ё...
Эт точно...
...
Рейтинг: 0 / 0
Lazarus
    #39877869
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен. Нормальные строки решат весь ох е...
...
Рейтинг: 0 / 0
Lazarus
    #39877889
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что ж, если человек желает продолжать плодить говнокод, то медицина тут бессильна
...
Рейтинг: 0 / 0
Lazarus
    #39877932
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2то медицина тут бессильна
не обижай зря человека. ИМХО, иногда воркэраунд целесообразнее, чем замена свечей на работающем двигателе.
...
Рейтинг: 0 / 0
25 сообщений из 314, страница 5 из 13
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]