Модератор: Модераторы
resident писал(а):Похоже то что нужно, благодарствую.
resident писал(а):Из xml читаются размеры книги, текстовое значение узла в основном похоже на 100х200, а также может быть 100х200/5.
Кроме этого в узле иногда попадается хлам - пробелы, запятые или вобще буквы.
"х" может быть и мелкая и большая и наша и латиница.
Что делаю я:
StringReplace-ом преобразую любые "х" к мелкой латинской.
Посимвольно читаю строку и если текущий символ от "0" до "9" или латинская "х", "Х" или наша "х", "Х" или "/", то он мне подходит и я его беру для заполнения чистой строки для парсинга.
Что-то типа такого (OfferBinding - строка с хламом):
- Код: Выделить всё
Str := '';
OfferBinding := StringReplace(OfferBinding, 'х', 'x', [rfReplaceAll, rfIgnoreCase]);
OfferBinding := StringReplace(OfferBinding, 'Х', 'x', [rfReplaceAll, rfIgnoreCase]);
OfferBinding := StringReplace(OfferBinding, 'X', 'x', [rfReplaceAll, rfIgnoreCase]);
for i := 0 to High(OfferBinding) do
if (OfferBinding[i] in ['0'..'9']) or (OfferBinding[i] in ['x', '/']) then Str := Str + OfferBinding[i];
([\dхХX/]+)+
(\d+)[хХX](\d+)/(\d+)
Плин... они для юзверя писать должны, а не для ... И должны рассчитывать на большие объёмы инфы, а не десяток строчек...В общем, прикладным программистам действительно ни к чему связываться с посимвольным доступом к строкам.
pupsik писал(а):convertEncoding(StringReplace('эЭяЯюЮ', 'я', 'ы', [rfReplaceAll, rfIgnoreCase]), guessEncoding(s), encodingAnsi);
Mirage писал(а):В общем, прикладным программистам действительно ни к чему связываться с посимвольным доступом к строкам.
pupsik писал(а):А регулярки стали работать быстрее "заточенной" функции?
Mirage писал(а):Но вот эта, думаю, будет хороша
неужели?....Хорошие реализации регулярных выражений работают весьма быстро.
... Если не использовать не латиницу - море... И почему мы используем эту не латиницу?Есть ли хорошие реализации RegExp для FPC
pupsik писал(а):Если не использовать не латиницу - море...
аналогичное мнение.намеки слабо понятны
А в лазаре synedit с кирилицей работает... Ну..у через кхм..м... но..о работает.Реализация от BeRo декларирует поддержку уникода,
resident писал(а):Лекс Айрин писал(а):вообще-то, есть функция UTF8Pos...
Похоже то что нужно, благодарствую. Я несколько страниц пытался узнать эту тайну.![]()
Может где есть сводка: что теперь можно, а что нельзя?
Если это все работает, то тогда действительно тот чемодан без ручки можно выкинуть. Но возникает вопрос: а что если после выкидывания тех функций переименовать эти, чтоб были без префикса "UTF8"? И все были бы довольны, и код бы читался лучше, да и писать меньше?
з.ы. Почему пишут, что функция устарела? Я еще испробовать не успел, а она уже устарела.А что теперь в тренде?
Deprecated, see #LazUtils.LazUTF8 for replacements.
http://lazarus-ccr.sourceforge.net/docs ... f8pos.html
function FindProductAll(V: TVirtualStringTree; P: PVirtualNode; T: TStringList): PVirtualNode;
var i, l, k: Integer;
Data: PPrice;
begin
if not Assigned(P) then P := V.RootNode^.FirstChild
else P := V.GetNextNoInit(P);
Result := nil;
k := T.Count;
while Assigned(P) do begin
Data := V.GetNodeData(P);
if Data^.IsShow then begin;
l := 0;
for i := 0 to k-1 do begin
if Pos(T[i], UTF8UpperCase(Data^.Name)) <= 0 then Break;
Inc(l);
end;
if l = k then Exit(P)
end;
P := V.GetNextNoInit(P);
end;
end;
ogorodov писал(а):В этой версии перестала работать функция UTF8ToSys() ... при сборке под винду ... или это только у меня так
LazUTF8.UTF8ToSys()
sign писал(а):Замечательно работает функция Pos(), просто нужно понимать, что она делает.
Она находит символы в строке. И без разницы, какова кодировка и что там сколько байт занимает, если в искомой строке и искомая подстрока - "одного поля ягоды", т.е., одной кодировки.
woodhead писал(а):Я так понял, что надо использовать lazutf8. Но вот как именно использовать, не доходит. Буду признателен за объяснение или ссылку на мануал.
Начиная с FPC 2.7.1 кодовая страница, используемая RTL по умолчанию, может быть изменена на UTF-8 (CP_UTF8)
AnsiToUTF8, UTF8ToAnsi, SysToUTF8, UTF8ToAnsi не действуют. Они использовались преимущественно для вышеуказанных функций, которые больше не требуют преобразований аргументов и результата.
Многочисленные явные вызовы UTF8Encode и UTF8Decode больше не нужны, поскольку при присваивании строки в UnicodeString строке String и наоборот компилятор сделает это автоматически.
Что происходит, когда я ввел промежуточную переменную типа string, и case заработал? Конвертация по Лазарусовски?
{$DEFINE DisableWrapperFunctions}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7