![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте!
В Delphi 2009 хочу прочитать файл кодированный в utf8 в строку типа UTF8String. Код:
...
uses Classes, SysUtils, Windows;
...
function ReadFromFile(FileName:String):UTF8String;
var
hFile, Size: Integer;
Buffer: ^UTF8String;
begin
hFile := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
try
Size := SysUtils.FileSeek(hFile,0,2);
FileSeek(hFile,0,0);
GetMem(Buffer, Size);
FileRead(hFile, Buffer^, Size);
Result := UTF8String(Buffer);
finally
FileClose(hFile);
end;
end;
...После строки "Result := UTF8String(Buffer);" выскакивает ошибка "Access violation". При этом в окне watch строка UTF8String(Buffer) показывает правильное значение. В чем моя ошибка? |
|
#2
|
|||
|
|||
|
В этой теме (http://www.delphisources.ru/forum/sh...ad.php?t=13012) выкладывались исходники, которые умеют читать UTF8.
|
|
#3
|
|||
|
|||
|
Нашёл решение проблемы.
Текст файла уже в utf8 и преобразование к utf16 не требуется. Код:
function ReadFromFile(FileName:String):UTF8String;
const
Error = 'File to large!';
var
Size: Int64Rec;
hFile: Integer;
begin
hFile := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
try
Size.Lo := GetFilesize(hFile, @Size.Hi);
if Int64(Size) > 1048576 then raise Exception.Create(Error); // Size > 1MB
SetLength(Result, Size.Lo);
FileRead(hFile, (PUTF8String(Result))^, Size.Lo);
finally
FileClose(hFile);
end;
end; |
|
#4
|
|||
|
|||
|
Цитата:
Как вариант, можно (для D 2009) примерно так : Код:
function FromTextFileToWideString(fn : string; Encoding : TEncoding) : WideString;
Var
List : TStrings;
begin
Result:='';
fn:=trim(fn);
if FileExists(fn) then begin
List := TStringList.Create;
TRY
List.LoadFromFile(fn,Encoding);
Result:=List.Text;
FINALLY
FreeAndNil(List);
END;
end;
end;Для UTF8 вызов : MyWideString := FromTextFileToWideString('C:\111.txt', TEncoding.UTF8); |