From dd0a4014b68f9bb64910e915f40dc47ad14c0d24 Mon Sep 17 00:00:00 2001 From: juha Date: Sun, 29 Dec 2019 23:18:57 +0000 Subject: [PATCH] LazUtils: LConvEncoding fix for CP936 and other DBCS codepages. Issue #36492, patch from CudaText man. git-svn-id: trunk@62467 - --- .../lazutils/asiancodepagefunctions.inc | 29 +++++++++++++++++-- components/lazutils/lconvencoding.pas | 25 ++++++++++++++-- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/components/lazutils/asiancodepagefunctions.inc b/components/lazutils/asiancodepagefunctions.inc index 93e0f97c81..0bf5e8d55d 100644 --- a/components/lazutils/asiancodepagefunctions.inc +++ b/components/lazutils/asiancodepagefunctions.inc @@ -46,6 +46,20 @@ begin begin l:=UnicodeToUTF8Inline(code,Dest); inc(Dest,l); + end + else + case ConvertEncodingErrorMode of + ceemSkip: + begin end; + ceemException: + raise EConvertError.Create('Cannot convert DBCS code page to UTF8'); + ceemReplace: + begin + Dest^:='?'; + Inc(Dest); + end; + ceemReturmEmpty: + Exit(''); end; end; until false; @@ -209,8 +223,19 @@ begin Inc(Dest); end else - if ConvertEncodingFromUtf8RaisesException then - raise EConvertError.Create('Cannot convert UTF8 to DBCS code page'); + case ConvertEncodingErrorMode of + ceemSkip: + begin end; + ceemException: + raise EConvertError.Create('Cannot convert UTF8 to DBCS code page'); + ceemReplace: + begin + Dest^ := '?'; + Inc(Dest); + end; + ceemReturmEmpty: + Exit(''); + end; end; until false; //SetLength(Result, Dest - PChar(Result)); diff --git a/components/lazutils/lconvencoding.pas b/components/lazutils/lconvencoding.pas index b8456e43ef..581e1637f2 100644 --- a/components/lazutils/lconvencoding.pas +++ b/components/lazutils/lconvencoding.pas @@ -31,8 +31,16 @@ uses SysUtils, Classes, dos, LazUTF8 {$IFDEF EnableIconvEnc},iconvenc{$ENDIF}; +type + TConvertEncodingErrorMode = ( + ceemSkip, + ceemException, + ceemReplace, + ceemReturmEmpty + ); + var - ConvertEncodingFromUtf8RaisesException: boolean = False; + ConvertEncodingErrorMode: TConvertEncodingErrorMode = ceemSkip; //encoding names const @@ -2105,8 +2113,19 @@ begin inc(Dest); end else - if ConvertEncodingFromUtf8RaisesException then - raise EConvertError.Create('Cannot convert UTF8 to single byte'); + case ConvertEncodingErrorMode of + ceemSkip: + begin end; + ceemException: + raise EConvertError.Create('Cannot convert UTF8 to single byte'); + ceemReplace: + begin + Dest^:='?'; + inc(Dest); + end; + ceemReturmEmpty: + Exit(''); + end; end; end; SetLength(Result,Dest-PChar(Result));