Заменить строку, содержащую # 0? - PullRequest
0 голосов
/ 01 июля 2010

Я использую эту функцию для чтения файла в строку

function LoadFile(const FileName: TFileName): string;
begin
  with TFileStream.Create(FileName,
      fmOpenRead or fmShareDenyWrite) do begin
    try
      SetLength(Result, Size);
      Read(Pointer(Result)^, Size);
    except
      Result := '';  
      Free;
      raise;
    end;
    Free;
  end;
end;

Вот текст файла:

version  

Вот возвращаемое значение LoadFile:

'ÿþv'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0

Я хочу, чтобы новый файл содержал "verabc".Проблема в том, что у меня все еще есть проблема заменить "sion" на "abc".Я использую D2007.Если я уберу все # 0, то результатом станет китайский символ.

Ответы [ 2 ]

8 голосов
/ 01 июля 2010

То, что вы считаете текстом файла, на самом деле не текст файла.То, что вы прочитали в строковую переменную, является точным.У вас есть текстовый файл Unicode, закодированный как little-endian UTF-16.Первые два байта представляют метку порядка байтов, и каждая пара байтов после этого является другим символом строки.

Если вы читаете файл Unicode, вы должны использовать тип данных Unicode, напримерWideString.При установке длины строки вы захотите разделить размер файла на два, и вы захотите отбросить первые два байта.

Если вы не знаете, какой тип файла вы используетепосле чтения вам нужно сначала прочитать первые два или три байта.Если первые два байта являются $ ff $ fe, как указано выше, то у вас может быть файл UTF-16 с прямым порядком байтов;прочитайте оставшуюся часть файла в WideString или UnicodeString, если у вас есть этот тип.Если они $ fe $ ff, то это может быть big-endian;прочитайте оставшуюся часть файла в WideString и затем поменяйте местами порядок каждой пары байтов.Если первые два байта равны $ ef $ bb, проверьте третий байт.Если это $ bf, то это, вероятно, знак порядка байтов UTF-8.Откажитесь от всех трех и прочитайте оставшуюся часть файла в AnsiString или массив байтов, а затем используйте функцию, такую ​​как UTF8Decode, чтобы преобразовать ее в WideString.

Как только вы получите свои данныев WideString отладчик покажет, что он содержит version, и у вас не должно возникнуть проблем с использованием Unicode-версии StringReplace для замены.

0 голосов
/ 01 июля 2010

Кажется, что вы загружаете текстовый файл в кодировке Unicode.0 обозначает латинский символ.

Если вы не хотите иметь дело с текстом Unicode, выберите кодировку ANSI в редакторе при сохранении файла.

Если вам нужна кодировка Unicode, используйте WideCharToString, чтобы преобразовать его вANSI-строку или просто удалите себя 0 s, хотя последнее не лучшее решение.Также удалите 2 начальных символа, ÿþ.
. Редактор поместил эти байты в , помечая файл как Unicode.

...