[fpc-pascal] Read lines into UnicodeString variable from UCS2 (UTF-16) encoded text file
Tony Whyman
tony.whyman at mccallumwhyman.com
Wed Sep 4 12:21:18 CEST 2019
You may be able to improve on this using system.BlockRead.
Also, you are assuming low order byte first which may not be portable.
On 04/09/2019 11:14, LacaK wrote:
> Nice! Thank you very much.
>
> As an alternative for F:TextFile I am using:
>
> procedure UCS2ReadLn(var F: TextFile; out s: String);
> var
> c: record
> case boolean of
> false: (a: array[0..1] of AnsiChar);
> true : (w: WideChar);
> end;
> begin
> s:='';
> while not Eof(F) do begin
> System.Read(F,c.a[0]);
> System.Read(F,c.a[1]);
> if c.w in [#10,#13] then
> if s = '' then {begin of line} else break {end of line}
> else
> s := s + c.w;
> end;
> end;
>
> which works for me also, but I would be like to have better solution.
> I will try LoadFromFile with TEncoding once FPC 3.2 will be out.
>
> -L.
>
>> Stupid an lazy workaround, probably not suitable for larger files.
>>
>> {$mode objfpc}
>> {$h+}
>> uses
>> sysutils;
>>
>> type
>> TUCS2TextFile = file of WideChar;
>>
>> procedure ReadLine(var F: TUCS2TextFile; out S: UnicodeString);
>> var
>> WC: WideChar;
>> begin
>> //Assume file is opend for read
>> S := '';
>> while not Eof(F) do
>> begin
>> Read(F, WC);
>> if WC = WideChar(#$000A) then
>> exit
>> else
>> if (WC <> WideChar(#$000D)) and (WC<>WideChar(#$FEFF {Unicode LE
>> BOM})) then S := S + WC;
>> end;
>> end;
>>
>> var
>> UFile: TUCS2TextFile;
>> US: UnicodeString;
>> begin
>> AssignFile(UFile, 'ucs2.txt');
>> Reset(Ufile);
>> while not Eof(UFile) do
>> begin
>> ReadLine(UFile, US);
>> writeln('US = ',US);
>> end;
>> CloseFile(UFile);
>> end.
>>
>> Outputs
>> US = Line1
>> US = Line2
>> US = Line3
>> which is correct for my test file (Unicode LE encoding created with
>> Notepad).
>>
>> --
>> Bart
>> _______________________________________________
>> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
>> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>
More information about the fpc-pascal
mailing list