Skip to content

Commit

Permalink
Strings: LoadStringFromFile - added new parameter: ForceEncoding
Browse files Browse the repository at this point in the history
  • Loading branch information
jackdp committed Jun 16, 2022
1 parent c322e7c commit 94fb9bc
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions Base/JPL.Strings.pas
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ function GetDecimalSeparator: Char;

function SaveStringToFile(const FileName, Content: string; Encoding: TEncoding; const WriteBOM: Boolean = True):Boolean; overload;
function SaveStringToFile(const FileName, Content: string): Boolean; overload;
function LoadStringFromFile(const FileName: string; var s: string; Encoding: TEncoding): Boolean; overload;
function LoadStringFromFile(const FileName: string; var s: string; Encoding: TEncoding; ForceEncoding: Boolean = False): Boolean; overload;
function LoadStringFromFile(const FileName: string; var s: string): Boolean; overload;


Expand Down Expand Up @@ -252,47 +252,53 @@ function SaveStringToFile(const FileName, Content: string): Boolean; overload;
end;

{$IFDEF FPC}
function LoadStringFromFile(const FileName: string; var s: string; Encoding: TEncoding): Boolean; overload;
function LoadStringFromFile(const FileName: string; var s: string; Encoding: TEncoding;ForceEncoding: Boolean = False): Boolean; overload;
var
Bytes: TBytes = nil;
xBomLen: integer;
UserEncoding: TEncoding;
begin
Result := False;
if not FileExists(FileName) then Exit;
Result := GetFileContentAsBytes(FileName, Bytes);
if Result then
begin
UserEncoding := Encoding;
Encoding := nil;
// http://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.TEncoding.GetBufferEncoding
// https://www.freepascal.org/docs-html/rtl/sysutils/tencoding.getbufferencoding.html
// GetBufferEncoding detects encoding of Bytes, and assigns detected encoding to the Encoding param.
// So after GetBufferEncoding, the Encoding is NOT = nil
xBomLen := TEncoding.GetBufferEncoding(Bytes, Encoding, TEncoding.Default);
{$IFDEF FPC320_OR_ABOVE}
s := Encoding.GetAnsiString(Bytes, xBomLen, Length(Bytes) - xBomLen);
{$ELSE}
s := string(Encoding.GetString(Bytes, xBomLen, Length(Bytes) - xBomLen));
{$ENDIF}

if ForceEncoding then s := UserEncoding.GetAnsiString(Bytes, xBomLen, Length(Bytes) - xBomLen)
else s := Encoding.GetAnsiString(Bytes, xBomLen, Length(Bytes) - xBomLen);

end;
end;
{$ELSE}
function LoadStringFromFile(const FileName: string; var s: string; Encoding: TEncoding): Boolean; overload;
function LoadStringFromFile(const FileName: string; var s: string; Encoding: TEncoding; ForceEncoding: Boolean = False): Boolean; overload;
var
Bytes: TBytes;
xBomLen: integer;
UserEncoding: TEncoding;
begin
Result := False;
if not FileExists(FileName) then Exit;
Result := GetFileContentAsBytes(FileName, Bytes);
if Result then
begin
UserEncoding := Encoding;
Encoding := nil;
// http://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.TEncoding.GetBufferEncoding
// https://www.freepascal.org/docs-html/rtl/sysutils/tencoding.getbufferencoding.html
// GetBufferEncoding detects encoding of Bytes, and assigns detected encoding to the Encoding param.
// So after GetBufferEncoding, the Encoding is NOT = nil
xBomLen := TEncoding.GetBufferEncoding(Bytes, Encoding {$IFDEF DELPHIXE_OR_ABOVE}, TEncoding.Default{$ENDIF});
s := Encoding.GetString(Bytes, xBomLen, Length(Bytes) - xBomLen);

if ForceEncoding then s := UserEncoding.GetString(Bytes, xBomLen, Length(Bytes) - xBomLen)
else s := Encoding.GetString(Bytes, xBomLen, Length(Bytes) - xBomLen);

end;
end;
{$ENDIF}
Expand Down

0 comments on commit 94fb9bc

Please sign in to comment.