Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

StringReplace не работает для строки в Unicode


Страницы:   1 2

Reals ©   (2007-08-05 15:01:00) 

Здравствуйте!

Действия следующие: из бинарного файла, читается определенное количество байтов и помещается в переменную String. Считанные данные находятся в кодировке Unicode. Теперь мне нужно удались символы нулевого значения Chr(0), а StringReplace не хочет заменять этот символ, кстати и вообще никакое символ не заменяется. В чем может быть причина, помогите пожалуйста разобраться.
Может можно просто сконвертировать переменную String из Unicode в  другую кодировку? Если да, то как?

P.S. Для замены исползую так StringReplace(tmp, Chr(0), '', [rfReplaceAll]); и так StringReplace(tmp, #0, '', [rfReplaceAll]);

Заранее премного благодарен!


Reals   (2007-08-05 20:20:00) [21]

А кто говорил что я чего-то хочу от WideString? я просто спросил почему не работает StringReplace если считываемая строка в Unicode. Перенные я также пробовал определять как WideString, тоже не помогает.


Anatoly Podgoretsky   (2007-08-05 20:11:00) [22]

И чего ты хочешь от WideString, если Tmp типа string


Reals   (2007-08-05 20:08:00) [23]

кстати, а может кто знает, мне вообще нужно из Java перевести код на Delphi, вот такой кусочек:
java.io.InputStream in = omaFile.toURL().openStream();
byte[] bs = new byte[3178];
in.read(bs);
String tempTitle = new String(bs);
int index1 = 20;
int index2 = index1+10+(toInteger(bs[index1+6])*256) + toInteger(bs[index1+7]);
title = tempTitle.substring(index1+12,index2).replace(""+(char)0,"") + " - " + (toInteger(bs[index1+6])*256);


Может кто подскажет как правильно написать на Delphi?

Спасибо огромное.


Reals   (2007-08-05 20:03:00) [24]

const countByte = 3178;
var
 fs: TFileStream;
 Buffer: Sing;
 tempTitle, tmp: String;
 f: TextFile;
begin

 fs := TFileStream.Create('file.bin', fmOpenRead);
 try
   SetLength(Buffer, countByte);
   fs.Read(Buffer[1], countByte);
   tempTitle := Buffer;

   tmp := Copy(tempTitle, 12, 50);
   tmp := StringReplace(tmp, Chr(0), '', [rfReplaceAll]);

   AssignFile(f, 'temp.log');
   Rewrite(f);
   WriteLn(f, #10#10+tmp);
   CloseFile(f);

 finally
   fs.Free;
 end;
end;


в переменной tmp ничего не меняется. Copy работает, а StringReplace нет.


MetalFan   (2007-08-05 19:55:00) [25]


> именно из файла прочитать строку

показывай, как читаешь


Reals   (2007-08-05 19:46:00) [26]

Если через переменную WideString пример делать, то все работает, а вот если именно из файла прочитать строку, то тогда эти данные даже не выводятся ни в ShowMessage, ни в Memo, ну и StringReplace не обрабатывает эту строку, только записывается в файл эта строка.

Может кто знает в чем причина.

Спасибо.


MetalFan   (2007-08-05 17:30:00) [27]


> иначе это может иметь последствия.

сорри, просто я в "прочем" для шутки переименовался, а оно и запомнилось(


Anatoly Podgoretsky   (2007-08-05 17:25:00) [28]

Следи за одинаковостью ников в пределе одной ветки, иначе это может иметь последствия.


MetalFan   (2007-08-05 16:59:00) [29]

чорт. хард это я был)


Инс   (2007-08-05 16:50:00) [30]


> [2] хард   (05.08.07 16:43)

Естественно. Так как параметр на входе StringReplace должен быть AnsiString, а присваивание к переменной типа AnsiString значения типа WideString приводит к автоматической перекодировке. Другими словами:
A: String;
W: WideString;
...
 A:='fdd';
 W:=A; // Тут будет выполнена перекодировка
 A:=W; // И тут также


хард   (2007-08-05 16:43:00) [31]

хм. при работе StringReplace WideString строка переводится автоматически в AnsiString...


Yanis   (2007-08-05 15:19:00) [32]


> кстати и вообще никакое символ не заменяется.

var
 ws: WideString;
begin
 ws := 'комманда';
 ShowMessage(StringReplace(ws, 'мм', 'м', [rfReplaceAll]));
end;


Что у меня неправильно?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо