Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.06 c
6-1165573291
net_daemon
2006-12-08 13:21
2007.08.26
Как работать на канальном и (или) физическом уровне?


15-1185386364
Piter
2007-07-25 21:59
2007.08.26
Структурность vs Простота


1-1181823351
BlackCat
2007-06-14 16:15
2007.08.26
TDataTimePicker ы в строках StringGrida


15-1185523979
Reindeer Moss Eater
2007-07-27 12:12
2007.08.26
Синоним к "Decisions", начинающийся на "D"


15-1185435461
Autokont
2007-07-26 11:37
2007.08.26
1С и Vista





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский