From 94fb9bc3c81c9fb62f6ab0a731300c826dff7ab1 Mon Sep 17 00:00:00 2001 From: Jacek Pazera Date: Thu, 16 Jun 2022 19:49:44 +0200 Subject: [PATCH] Strings: LoadStringFromFile - added new parameter: ForceEncoding --- Base/JPL.Strings.pas | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/Base/JPL.Strings.pas b/Base/JPL.Strings.pas index 168686c..31a182f 100644 --- a/Base/JPL.Strings.pas +++ b/Base/JPL.Strings.pas @@ -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; @@ -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}