Страница 1 из 1

Аналог StringReplace для msestring?

СообщениеДобавлено: 12.01.2011 01:00:37
t-ea
Есть ли в mse аналог функции StringRepalce принимающий и возвращающий результат в msestring?

Re: Аналог StringReplace для msestring?

СообщениеДобавлено: 12.01.2011 12:52:59
debi12345
Мартин ответил:
Have a look to FPC StringReplace() function in rtl/objpas/sysutils/systr.inc.

А чем не удовлетворяет паскальная "StringReplace" ?

Re: Аналог StringReplace для msestring?

СообщениеДобавлено: 13.01.2011 11:08:19
t-ea
Есть текстовый файл в формате UTF8. Оттуда читаются строки, некоторые значения в них заменяются и записываются назад, естественно, опять в UTF8.

При преобразовании в стандартный string (для StringReplace) некоторые символы теряются — заменяются на вопросительные знаки, в частности символ неразывного дефиса (в UTF8 выглядит как $E2 $80 $91).

Поэтому я и спрашиваю, есть ли уже функция замены строк работающая c уникодом?

Re: Аналог StringReplace для msestring?

СообщениеДобавлено: 13.01.2011 12:30:56
debi12345
Доложено Мартину.
У него есть пара методов в связке в "msestrings.pas", но я обнаружил, что эта связка забивает после-текст если заменяющее слово длиннее заменяемого.

Добавлено спустя 5 часов 4 минуты 26 секунд:
Готово, нужно протестировать:

Trunk 4286 has replacestring() function, experimental, please test.

Re: Аналог StringReplace для msestring?

СообщениеДобавлено: 14.01.2011 11:46:09
t-ea
Не хочет :(

В первом случае произошла замена не всей подстроки, а во втором вообще не должно быть никаких замен.

Re: Аналог StringReplace для msestring?

СообщениеДобавлено: 14.01.2011 17:11:36
debi12345
Ответ:

"
S1:='<text:text-input
text:description="Фамилия">$Фамилия$</text:text-input>';
se1.Value:=S1;
se2.Value:=UTF8ToString(S1);
"
Doesn't work,
"
'<text:text-input
text:description="Фамилия">$Фамилия$</text:text-input>'
"
will be converted utf-8 -> utf-16 on compiletime and converted utf-16 ->
current system encoding on runtime by the unicodestringmanager.
"
S1:='<t...
"

Coneversion current system encoding -> utf-16 on runtime by the
widestringmanager.
"
se1.Value:=S1;
"

So either use all msestring and msestring version of replacestring():
"
var
S1, S2 : msestring;
begin
S1:='<text:text-input
text:description="Фамилия">$Фамилия$</text:text-input>';
se2.Value:=S1;
se3.Value:=ReplaceString(S1, '$Фамилия$', 'Иванов');
"

or all utf-8 ansistring, now FPC ansi StringReplace() can be used:
"
var
S1, S2 : string;
begin
S1:= stringtoutf8('<text:text-input
text:description="Фамилия">$Фамилия$</text:text-input>');
se2.Value:= utf8tostring(S1);
se3.Value:= utf8tostring(StringReplace(S1,stringtoutf8('$Фамилия$'),
stringtoutf8('Иванов'),[]));
"


> Lower: there's should be nothing replaced.

Should be fixed in trunk 4265, there was a wrong parenthesis.

Re: Аналог StringReplace для msestring?

СообщениеДобавлено: 19.01.2011 19:23:14
t-ea
Извиняюсь что долго не отвечал - только сегодня смог проверить. Теперь всё работает как мне надо.

Первый пример и не должен был работать, (там нет преобразования из UTF8), но заметил это уже после отправки сообщения и не стал исправлять.