![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StringReplace не работает для строки в Unicode
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;
Что у меня неправильно?