Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.26;
Скачать: CL | DM;

Вниз

StringReplace не работает для строки в Unicode   Найти похожие ветки 

 
Reals   (2007-08-05 15:01) [0]

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

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

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

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


 
Yanis ©   (2007-08-05 15:19) [1]


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

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


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


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

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


 
Инс ©   (2007-08-05 16:50) [3]


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

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


 
MetalFan ©   (2007-08-05 16:59) [4]

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


 
Anatoly Podgoretsky ©   (2007-08-05 17:25) [5]

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


 
MetalFan ©   (2007-08-05 17:30) [6]


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

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


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

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

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

Спасибо.


 
MetalFan ©   (2007-08-05 19:55) [8]


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

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


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

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 нет.


 
Reals   (2007-08-05 20:08) [10]

кстати, а может кто знает, мне вообще нужно из 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?

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


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

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


 
Reals   (2007-08-05 20:20) [12]

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


 
Anatoly Podgoretsky ©   (2007-08-05 20:27) [13]

> Reals  (05.08.2007 20:20:12)  [12]

Что такое строка в Юникод


 
Reals ©   (2007-08-05 20:47) [14]

вот кусочек файла, из которого нужно прочитать определенное количество байтов и обработать куcочек строки.

http://realsweb.com/file.bin


> Anatoly Podgoretsky

Строка прочитана из файла, который в кодировке Unicode. Если вы видите что я чего-то не допонимаю, то объясните пожалуйста. Так как ниразу не приходилось пользоваться WideString`ами.


 
Плохиш ©   (2007-08-05 21:55) [15]


> Reals   (05.08.07 20:20) [12]
> А кто говорил что я чего-то хочу от WideString?

Символ #0 является ограничителем в AnsiString, поэтому все функции, расчитанные на AnsiString, обрабатывают строку до первого символа #0.^

> Reals ©   (05.08.07 20:47) [14]

В приведённом куске файла юникодом и не пахнет, простой набор байтов...


 
Reals ©   (2007-08-05 22:05) [16]


> Плохиш

Так вот как бы мне из этого набора байтов удались символы с кодом #0?


 
Плохиш ©   (2007-08-05 22:11) [17]


> Reals ©   (05.08.07 22:05) [16]
>
> > Плохиш
>
> Так вот как бы мне из этого набора байтов удались символы
> с кодом #0?

В цикле...


 
MetalFan ©   (2007-08-05 22:19) [18]


> расчитанные на AnsiString, обрабатывают строку до первого
> символа #0

не совсем, имхо, верно... AnsiString для совместимости с PChar конечно оканчивается #0, но функции для работы именно с AnsiString ориентируются скорее на Length(), чем на #0...
и по поводу топика... если нужна только замена #0#0 на #0#32 (пробел в юникоде), то проще наверное самому написать элементарный цикл


 
Anatoly Podgoretsky ©   (2007-08-05 22:38) [19]

> Плохиш  (05.08.2007 21:55:15)  [15]

Не все, но многие.
А вот Юникодом в коде и не пахнет.


 
Anatoly Podgoretsky ©   (2007-08-05 22:38) [20]

> Reals  (05.08.2007 22:05:16)  [16]

StringReplace


 
Anatoly Podgoretsky ©   (2007-08-05 22:39) [21]

> MetalFan  (05.08.2007 22:19:18)  [18]

А спрашивает про байты с кодом #0 - это разрушение.


 
MetalFan ©   (2007-08-05 22:42) [22]


> Anatoly Podgoretsky ©   (05.08.07 22:39) [21]

ммм... не "вкурил"))


 
Anatoly Podgoretsky ©   (2007-08-05 22:51) [23]

Не ты ли приводил "#0#0 на #0#32", вот теперь представь это только наоборот, для Юникода, с которым так пообращаются, не по твоему коду конечно, а по автору, который предложил заменить байты 0 на что ни будь, кроме разрушения ничего хорошего не будет.


 
Anatoly Podgoretsky ©   (2007-08-05 22:52) [24]

Автор смутно представляет, что такое Юникод и как с ним работать.


 
MetalFan ©   (2007-08-05 23:04) [25]

а, сорь) просто не сразу догнал смысл Вашей фразы)))


 
Reals ©   (2007-08-05 23:06) [26]

Спасибо огромною за помощь.
Действительно я смутно представляю что такое Юникод, и в программировании ни разу не приходилось его обрабатывать.
Меня интересует только выше стоящая задача, как из выше приведенного бинарного файла, вырезать часть кода и удались #0 символы. Если вы загляните внутрь файла вы увидите там название альбома "The Only Reason", между каждой буквой стоит нулевой символ. Вот мне необходимо вырезать этот кусочек, индексы начала и конца этой записи мне известны, и убрать нулевой символ, чтобы все буквы были слитно.
В цикле, как предложил Плохиш ©   (05.08.07 22:11) [17] не помогло.

Почему я решил что строка в Юникоде, так как вырезаный кусок у меня сохряняетсяв файле, когда я этот файл просматриваю в кодировке Unicode то этих нулевых символов нет, и все буквы в строке слитно.


 
Anatoly Podgoretsky ©   (2007-08-05 23:15) [27]

> Reals  (05.08.2007 23:06:26)  [26]

Удаление ряда символов (байтов) из двоичного файла наверняка привед к его порче.
Буквы и так слитны, они просто в Юникод.


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


> Anatoly Podgoretsky ©   (05.08.07 23:15) [27]

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


 
Anatoly Podgoretsky ©   (2007-08-05 23:24) [29]

> Reals  (05.08.2007 23:20:28)  [28]

С этого надо было и начинать

S := WS

и все


 
Sdubaruhnul   (2007-08-06 00:27) [30]

На всякий случай библиотека функций для работы с Юникодом:
http://www.soft-gems.net/index.php?option=com_content&task=view&id=23&Itemid=33


 
Reals ©   (2007-08-06 02:28) [31]

Спасибо всем огромное, кое-какие продвижения есть... буду разбираться дальше.

Удачи!


 
Loginov Dmitry ©   (2007-08-06 07:46) [32]

StringReplace не работает из-за вызова SysUtils.AnsiStrPos, которая ориенрируется на символ #0.



Страницы: 1 вся ветка

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.019 c
2-1186091641
Slonik
2007-08-03 01:54
2007.08.26
Эмулятор нажатия Enter а


15-1185806075
DillerXX
2007-07-30 18:34
2007.08.26
Я может слишком жалостлив к людям, но...


15-1185805203
Slider007
2007-07-30 18:20
2007.08.26
С днем рождения ! 30 июля 2007 понедельник


15-1185869482
mutobor
2007-07-31 12:11
2007.08.26
проблемы при работе с БД


2-1186311698
Reals
2007-08-05 15:01
2007.08.26
StringReplace не работает для строки в Unicode