![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение данных из файла UTF-8 [D6, WinXP]
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. Справку конечно взглянуть ты в очередной раз не догадался.