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

Вниз

txt фаил в unicode кодировке!!! Как правильно считать ???   Найти похожие ветки 

 
Dankin   (2005-10-20 03:04) [0]

Есть вот такая проблема. Есть текстовый фаил в unicode rjlbhjdrt (написан и сохранен как unicode в блокноте). Предположем там есть французкие или немецкие национальные буквы )))
Тык вот в чем вопрос, как считат из этого файла все строки правильно, если считываю простым ридом то скажем вместо строки "test" получаю "юя", не говоря уже об более экзотических символах... Хотя разумеется в ANSI все было впорядке. Переделывать текст в базу, нет ни времени ни целесообразности, а очень надо считывать юникод текст и показать его (с сохранением всех символов) в, скажем Label. Сам Label понимающий уникод вроде как нашол...
Помогите плиз, ну оооочччееенннь надо! Заранее огромное спасибо! )))


 
Джо ©   (2005-10-20 03:14) [1]

См. раздел стандартной справки Character set conversions и обратите внимание на функции WideCharToString и прочие похожие.


 
Dankin   (2005-10-20 03:24) [2]

Как раз сейчас это делаю. Чего то не получается. Во первых вопрос номер раз, в какую переменную (какой тип) нужно ридить строку из файла, в string или widestring. И если в widestring, to как ее вести дальше??? 8-\


 
Джо ©   (2005-10-20 03:29) [3]


> to как ее вести дальше??? 8-\

Это как перевести на русский?


 
Dankin   (2005-10-20 03:40) [4]

Ну в смысле, чего с ней дальше сделать чтоб все получилось )))

вот такой тестовый кусочек (если его конечно можно так назвать), при выполнении приводит прогу к ошибке!!!

var
 Form1: TForm1;
 f:text;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
s:pwidechar;
ss:string;
begin
assignfile(f,"test.txt");
reset(f);
read(f,ss);
stringtowidechar(ss,s,10);
closefile(f);
ss:=wideCharToString(s);
showmessage(ss);
end;

Причем ошибка вылетает как при выполнении Showmessage, так и при попытке пихнуть строку в TNTLABEL!
Ну и соответственно ошибка гласит:
Project raised exception class EAccessViolation with message ""Access violetion at address 0041DDA7 in module ..." Read of address 044F045E... ну и т.д. !!!
Чегойто я непонимаю чего я изначально не так делаю???!


 
Джо ©   (2005-10-20 03:45) [5]

Совершенно естественно, что вылетает ошибка. PWideChar - это просто указатель на область памяти. А памяти-то ты под нее и не выделил.

И непонятно, зачем ты туда сюда эту несчастную строку гоняешь - сначала в юникод, затем обратно.


 
Dankin   (2005-10-20 03:49) [6]

Так, при замене
stringtowidechar(ss,s,10);
на
stringtowidechar(ss,s,1);
showmessage стал выдавать ?B??, и это при том что
в файле просто надпись test!!! Да и глупо получается, сначала
считывать строку потом кидать ее в pwidechar а потом обратно
в строку!!! Значит нужно изначально читать как pwidechar!
Но тогда при компиляции выдается Illegal type in Read/Readln statement.
И на этом все останавливается, так как же правильно делать?!!!
Хелп плиз...


 
Набережных С. ©   (2005-10-20 08:47) [7]

Схема примерно такая:

function ReadWideCharFile(const FileName: string): WideString;
var
 FS: TFileStream;
 Sz: integer;
begin
 FS:=TFileStream.Create(FileName, fmOpenRead);
 try
   Sz:=FS.Size;
   if Sz > 0 then
   begin
     SetLength(Result, Sz shr 1);
     FS.ReadBuffer(Result[1], Sz);
   end;
 finally
   FS.Free;
 end;
end;

Но такая реализация может быть неоптимальной при больших размерах файла.


 
jack128 ©   (2005-10-20 10:35) [8]

Набережных С. ©   (20.10.05 8:47) [7]
var
FS: TFileStream;
Sz: integer;
begin
FS:=TFileStream.Create(FileName, fmOpenRead);
try
  Sz:=FS.Size - 2;
  if Sz > 0 then
  begin
    SetLength(Result, Sz shr 1);
    FS.Seek(2, 0); // первые два байта в юникодовском файле долны быть #$FF#$FE
    FS.ReadBuffer(Result[1], Sz);
  end;
finally
  FS.Free;
end;
end;


 
Игорь Шевченко ©   (2005-10-20 11:03) [9]


> первые два байта в юникодовском файле долны быть #$FF#$FE


Не обязательно


 
Dankin   (2005-10-20 11:40) [10]

Угу, сейчас буду пробовать, спасибо огромное. Я так понимаю содержимое файла целиком забивается в буфер, или нет???
А как при такой схеме скажем перекидать все строки файла в memo или listbox?! разуемеется адаптированный к unicode т.е. tnt )))


 
Dankin   (2005-10-20 15:42) [11]

Да, этот код безуловно работает!А как же сделать чтение всех строк, т.е. к примеру вывод строк в memo?


 
Набережных С. ©   (2005-10-20 16:52) [12]


> Dankin   (20.10.05 15:42) [11]

Memo.lines.text:=ReadWideCharFile(...)


 
KorvinOE ©   (2005-11-03 12:35) [13]


> Набережных С. ©   (20.10.05 16:52) [12]

Это не поможет, т.к. unicode может включать в себя символы конца строки. И эти символы могут распологаться в любом месте строки, а в Мемо.Тхт записуется только до первого такого символа. Надо unicode преобразовать в Ansi. Как же это сделать?


 
Набережных С. ©   (2005-11-03 16:57) [14]


> KorvinOE ©   (03.11.05 12:35) [13]
>
Если имеется в виду символы разделения строк(#13, #10#13), то Memo.Lines.Text их прекрасно обработает и разобьет по ним на строки.
Если подразумевается символ #0, то нормальный текстовый файл не должен их содержать. Но если все же есть то придется искать поработать руками...короче, проще показать:

var
 s: string;
 SL: TStrings;
 i: integer;
begin
 s:=ReadWideCharFile(...);
 Memo1.Lines.Clear;

 if s = "" then Exit;

 SL:=TStringList.Create;
 try

   i:=0;
   repeat
     Inc(i);
     SL.Text:=PChar(@s[i]);
     Memo1.Lines.AddStrings(SL);
     i:=PosEx(#0, s, i);
   until i = 0;

 finally
   SL.Free;
 end;
end;



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

Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.034 c
2-1130874663
Pasha L
2005-11-01 22:51
2005.11.20
Как два консольных приложения разделить по разным окнам


6-1123497734
ronyn
2005-08-08 14:42
2005.11.20
Как синхронизировать страницу?


2-1131189872
Kostafey
2005-11-05 14:24
2005.11.20
Программа то работает, то не работает на разных PC


9-1120581169
Green_Templar
2005-07-05 20:32
2005.11.20
пересечение отрезка и прямоугольника


14-1130221641
КаПиБаРа
2005-10-25 10:27
2005.11.20
Навыки Успеха для тех, кому от 16 до 30 лет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский