Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение данных из файла UTF-8 [D6, WinXP]


Страницы:   1 2

leonidus ©   (2008-06-13 11:58:00) 

Есть файл с данными в формате UTF8, мне нужно их прочесть и сконверировать в UTF16.

st_u:widestring;
f:textfile;

AssignFile(F, edit1.Text);
Reset(F);
readln(F,st_u);
st_u:= UTF8Decode(st_u);

В результате получаю st_u='', хотя при чтении из файла (readln(F,st_u)) строка содержит данные. Что же не так?


palva   (2008-06-13 16:15:00) [21]

Приведите входную строку в 16-ричном виде. (Длину и код каждого символа)
И выходую. (Ну, выходную строку мы уже знаем, она у вас пустая.)


ZENsan   (2008-06-13 15:43:00) [22]


function TUtils.LoadWideStringFromFile(Filename: string; var s: WideString;
 Limit: Integer): Boolean;
var
 i: integer;
 f: file;
 Buf: Pointer;
 Size: Integer;
 Sign: Word;
 FileType, SignC: Byte;
 Offset: Integer;
begin
 Result := False;
 AssignFile(f, Filename);
 if not FileExists(Filename) then
   Exit;
 Buf := nil;
 try
   Reset(f, 1);
 except
   Exit;
 end;
 try
   if FileSize(F) > 2 then
     begin
       BlockRead(f, Sign, 2);
       Offset := 2;
     end
   else
     begin
       Sign := 0;
       Offset := 0;
     end;
   case Sign of
     $BBEF: //UTF-8
       begin
         BlockRead(f, SignC, 1);
         if SignC = $BF then
           begin
             FileType := 1;
             Offset := 3;
           end
         else
           FileType := 0;
       end;
     $FEFF: FileType := 2; //Little-Endian
     $FFFE: FileType := 3; //Big-endian
   else
     begin
       FileType := 0;
       Reset(f, 1);
       Offset := 0;
     end;
   end;
   Size := FileSize(f) - Offset;
   if Limit > -1 then
     if Size > Limit then
       Size := Limit;
   GetMem(Buf, Size + 2);
   FillChar(Buf^, Size + 2, 0);
   BlockRead(f, Buf^, Size);
   case FileType of
     0:
       begin
         s := UTF8Decode(PAnsiChar(Buf));
         if s = '' then
           s := PAnsiChar(Buf);
       end;
     1: s := UTF8Decode(PAnsiChar(Buf));
     2: s := PWideChar(Buf);
     3:
       begin
         for i := 1 to Length(S) do
           Word(S[i]) := (Word(S[i]) shl 8) and (Word(S[i]) shr 8);
         s := PWideChar(Buf);
       end;
   end;
   Result := True;
 finally
   if Assigned(Buf) then
     FreeMem(Buf);
 end;
 CloseFile(f);
end;


leonidus   (2008-06-13 15:29:00) [23]

Попробовал еще так:

s:string;
st_u:widestring;

AssignFile(FromF, edit1.Text);
Reset(FromF, 1);

BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
s:='';
for i:=1 to 20048 do
 s:=s+buf[i];

st_u:=UTF8Decode(s);

все тоже самое.


leonidus   (2008-06-13 15:25:00) [24]

s:string;
st_u:widestring;

AssignFile(F, edit1.Text);
Reset(F);
readln(F,s);
st_u:= UTF8Decode(s);

так же ничего не дает.

В файле словарь в определенном формате который мне нужно загрузить в TTNTStringList.


palva   (2008-06-13 12:44:00) [25]

Строка для хранения UTF8 должна иметь тип String
Боюсь, что использовав WideString, вы заставили компилятор произвести ряд преобразований по умолчанию, что уничтожило ваши данные.


Anatoly Podgoretsky   (2008-06-13 12:40:00) [26]

Сейчас мы будем догадываться, что у тебя там в файле.
И почему st_u widestring. Справку конечно взглянуть ты в очередной раз не догадался.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо