Як завантажити в Memo текст з файлу в Юникоде
Шановні профі, як завантажити в Memo текст в юникоде з файлу?
Я робив так:
var s, s1: String;
# XA0; # XA0; f: TextFile;
begin
# XA0; AssignFile (f, FileName);
# XA0; Reset (f);
# XA0; while not EoF (f) do
# XA0; # XA0; begin
# XA0; # XA0; ReadLn (f, s);
# XA0; # XA0; s1: = WideCharToString (PWideChar (s));
# XA0; # XA0; Memo1.Lines.Add (s1);
# XA0; end;
end;
В результаті замість символів тексту я отримую знаки "?".
Я так думаю, що вся справа в WideCharToString (PWideChar (s)); здається що тут роблю щось не те або зовсім не те! Підкажіть будь ласка!
VCL не підтримує юнікод, використовуй сторонні компоненти, наприклад TNTComponents.
Дельфі підтримує Юнікод, ось тільки не треба використовувати TextFile
у мене головна проблема навіть не в відображенні тексту, а в отриманні даних з цього тексту. Припустимо, якщо взяти ini файл, тільки в юникоде і вручну його обробляти.
Мені здавалося щоб його самому обробити треба його спочатку в ANSI перекодувати.
а що просто через File ??
Можна і просто через File, але раджу TFileStream і запис відразу в WideString із заздалегідь встановленою довжиною, потім S: = WS
небагато не зрозуміло з другим параметром (довжиною) в ReadBuffer. Якщо я хочу прочитати відразу весь файл, вказувати Size?
> Небагато не зрозуміло з другим параметром (довжиною) в ReadBuffer.
> # XA0; Якщо я хочу прочитати відразу весь файл, вказувати Size?
Буфер - в байтах, тому - так.
при читанні видає помилку.
var # XA0; st: TFileStream;
# XA0; # XA0; ws: PWideChar;
# XA0; # XA0; s: String;
begin
# XA0; st: = TFileStream.Create (FileName, fmOpenRead);
# XA0; st.ReadBuffer (ws, st.Size); // тут видає помилку
# XA0; s: = WideCharToString (ws);
end;
> # XA0; st.ReadBuffer (ws, st.Size); // тут видає помилку
Сумно, дівчата, сумно.
А адже ж зовсім недавно поминали А.С. Пушкіна.
І який нах PWideChar.
тоді що, якщо PWideChar?
> Тоді що, якщо PWideChar?
[5]
Прикро за великого поета.
Читати вмієш? WideString і встановити розмір
все одно видає помилку!
Все одно де і з яким кодом.
І так і каже мовляв помилка?
А пам'ять хто буде виділяти, Пушкін?
що ж. буду вчитися. якщо що, ще звернуся!
P.S. Інформація до роздумів.
В [8] дві помилки. Одна вже кілька разів озвучена. Друга пов'язана з першим параметром процедури ReadBuffer.
ну перша помилка зрозуміло. неуважний! а друга, як тут і говорилося, виділення пам'яті. я зробив так:
var # XA0; st: TFileStream;
# XA0; # XA0; # XA0; ws: WideString;
# XA0; # XA0; # XA0; s: String;
begin
# XA0; st: = TFileStream.Create (FileName, fmOpenRead);
# XA0; SetLength (ws, st.Size);
# XA0; st.ReadBuffer (PWideChar (ws) ^, st.Size);
# XA0; s: = ws;
# XA0; Memo1.Lines.Add (s);
end;
в принципі працює, тільки в кінці знаки питань з'являються.