![]() |
|
|
Регистрация | << Правила форума >> | 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); |