Delphi (2009) - Преобразование чтения AnsiString или сохранение разрывов строк?
Используя этот (тестовый) код для чтения фрагмента текста из PNG:
procedure TForm1.Button1Click(Sender: TObject);
var
PngVar: TPngImage;
n: Integer;
begin
PngVar := TPNGImage.Create;
PngVar.LoadFromFile('C:\test.png');
for n := 0 to pred(PngVar.Chunks.count) do
if PngVar.Chunks.item[n].Name='tEXt' then
with PngVar.Chunks.item[n] as TChunkTEXT do
memo1.lines.add(KeyWord+'='+Text);
end;
Код взят из примера оригинального автора TPNGObject и был загружен с веб-сайта embercardo. KeyWord содержит значение того, что представляет собой блок tEXt, в данном случае это комментарий. Текст содержит текст, который нам нужен. Это AnsiString, и в нем должны быть разрывы, но при приведении из AnsiString к Unicode они теряются, и он становится одной строкой, в которой нет даже пробела между концом и началом строки.
Проходя через отладчик, я заметил, что каждая строка заключена в одинарные кавычки, а между строками есть #$A, что, как я полагаю, если я проверю в шестнадцатеричном виде, является некоторой формой управляющего символа.
комментарий = Скриншот PunkBuster (-) BF3 Levels/MP_017/MP_017'#$A'1135998 31.204.131.11:25530 GoTBF3.nl #4 | 32p | Только каналы TDM | 500 билетов '#$A'geawtaw46y4w63a46a34643a BorislavFatsolka '#$A'Ampteted: w=320 X h=240 при (x=50%,y=50%)'#$A'Результаты: w=320 X h=200 пробы =1'
Образец изображения http://www.pbbans.com/pbss_evidence/bf3/31.204.131.11:25530/5d00a95d22fae4a287bd510c076db1bf-2e36c3b4.png Вот образец. Я занимаюсь чтением данных с изображений punkbuster, чтобы сделать их доступными для поиска в нашей базе данных сообществ. Но я также отображаю информацию рядом с изображением и идентификатором, например, чтобы иметь разрывы строки и / или знать, когда строка заканчивается.
При непосредственном размещении в памятке или списке строк, все выходит одной строкой, например:
комментарий = Скриншот PunkBuster (-) BF3 Levels/MP_017/MP_0171135998 31.204.131.11:25530 GoTBF3.nl #4 | 32p | Только каналы TDM | 500 билетов *geawtaw46y4w63a46a34643a* BorislavFatsolkaAttempted: w=320 X h=240 при (x = 50%, y = 50%) в результате: w=320 X h=200 выборок = 1
Вопрос
Каков наилучший способ справиться с этой рассылкой, какой она есть из исходного изображения и / или TPNGImage не имеет реального выбора там. Помещение его в заметку, расширенное редактирование или список строк с неповрежденными разрывами.
Первое, что приходит на ум, вероятно, неэффективно, и это просто бросить его в байтовый массив или тому подобное и прочитать его побайтно, обрезая каждую строку в конце меток строки.
Дополнительные данные из примера Вы можете увидеть это, загрузив изображение примера, но вот так оно выглядит в шестнадцатеричном редакторе (первая часть файла не повреждена, заголовок png, ключевое слово заголовка блока tEXt и т. Д.
‰PNG........IHDR...Ž...2.....ûŒÆ$....tEXtcomment.PunkBuster Screenshot (ñ) BF3 Levels/MP_017/MP_017.1135998 31.204.131.11:25530 GoTBF3.nl #4 | 32p | TDM Canals Only | 500 Tickets.*geawtaw46y4w63a46a34643a* BorislavFatsolka.Attempted: w=320 X h=240 at (x=50%,y=50%).Resulting: w=320 X h=200 sample=1.
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 02 8E 00 00 01 32 08 02 00 00 00 FB 8C C6 24 00 00 01 03 74 45 58 74 63 6F 6D 6D 65 6E 74 00 50 75 6E 6B 42 75 73 74 65 72 20 53 63 72 65 65 6E 73 68 6F 74 20 28 F1 29 20 42 46 33 20 20 4C 65 76 65 6C 73 2F 4D 50 5F 30 31 37 2F 4D 50 5F 30 31 37 0A 31 31 33 35 39 39 38 20 33 31 2E 32 30 34 2E 31 33 31 2E 31 31 3A 32 35 35 33 30 20 47 6F 54 42 46 33 2E 6E 6C 20 23 34 20 7C 20 33 32 70 20 7C 20 54 44 4D 20 43 61 6E 61 6C 73 20 4F 6E 6C 79 20 7C 20 35 30 30 20 54 69 63 6B 65 74 73 0A 2A 67 65 61 77 74 61 77 34 36 79 34 77 36 33 61 34 36 61 33 34 36 34 33 61 2A 20 42 6F 72 69 73 6C 61 76 46 61 74 73 6F 6C 6B 61 0A 41 74 74 65 6D 70 74 65 64 3A 20 77 3D 33 32 30 20 58 20 68 3D 32 34 30 20 61 74 20 28 78 3D 35 30 25 2C 79 3D 35 30 25 29 0A 52 65 73 75 6C 74 69 6E 67 3A 20 77 3D 33 32 30 20 58 20 68 3D 32 30 30 20 73 61 6D 70 6C 65 3D 31 0A
Другие выводы Если я дам дамп Chunk (PngVar.Chunks.item[n].SaveToStream), он даст мне в основном то, что мы находим в шестнадцатеричном редакторе. Управляющие символы - 0А. Я не уверен, является ли #$A эффектом преобразования до или после, возможно, даже вызванным кодом pngimage.
2 ответа
Пытаться:
memo1.lines.add(KeyWord+'='+StringReplace(Text,#10,sLineBreak,[rfReplaceAll]));
Другим подходом будет Джедай CodeLib
sl := TJclStringList.Create;
sl.Split(Text, #10);
sl[0] := 'Keyword=' +sl[0]
memo1.lines.AddStrings(sl);
sl.Free;