Charset handling fixes by ACBr

git-svn-id: https://svn.code.sf.net/p/synalist/code/trunk@252 7c85be65-684b-0410-a082-b2ed4fbef004
This commit is contained in:
geby 2022-01-14 15:11:18 +00:00
parent 948daf7b74
commit aa1fdbacc4
2 changed files with 24 additions and 12 deletions

View File

@ -72,6 +72,11 @@ Internal routines knows all major charsets for Europe or America. For East-Asian
{$WARN IMPLICIT_STRING_CAST_LOSS OFF} {$WARN IMPLICIT_STRING_CAST_LOSS OFF}
{$ENDIF} {$ENDIF}
{$IFDEF NEXTGEN}
{$LEGACYIFEND ON}
{$ZEROBASEDSTRINGS OFF}
{$ENDIF}
unit synachar; unit synachar;
interface interface
@ -89,7 +94,7 @@ uses
Windows, Windows,
{$ENDIF} {$ENDIF}
SysUtils, SysUtils,
synautil, synacode, synaicnv; synautil, synacode, synaicnv, synafpc;
type type
{:Type with all supported charsets.} {:Type with all supported charsets.}
@ -1380,6 +1385,9 @@ var
NotNeedTransform: Boolean; NotNeedTransform: Boolean;
FromID, ToID: string; FromID, ToID: string;
begin begin
if not synaicnv.InitIconvInterface then
DisableIconv := True;
NotNeedTransform := (High(TransformTable) = 0); NotNeedTransform := (High(TransformTable) = 0);
if (CharFrom = CharTo) and NotNeedTransform then if (CharFrom = CharTo) and NotNeedTransform then
begin begin
@ -1508,7 +1516,11 @@ begin
{$IFNDEF POSIX} {$IFNDEF POSIX}
Result := GetCPFromID(nl_langinfo(_NL_CTYPE_CODESET_NAME)); Result := GetCPFromID(nl_langinfo(_NL_CTYPE_CODESET_NAME));
{$ELSE} {$ELSE}
{$IFNDEF ANDROID}
Result := GetCPFromID(nl_langinfo(CODESET)); Result := GetCPFromID(nl_langinfo(CODESET));
{$ELSE}
Result := UTF_8;
{$ENDIF}
{$ENDIF} {$ENDIF}
{$ELSE} {$ELSE}
//How to get system codepage without LIBC? //How to get system codepage without LIBC?

View File

@ -105,9 +105,9 @@ type
var var
iconvLibHandle: TLibHandle = 0; iconvLibHandle: TLibHandle = 0;
function SynaIconvOpen(const tocode, fromcode: Ansistring): iconv_t; function SynaIconvOpen(const tocode, fromcode: AnsiString): iconv_t;
function SynaIconvOpenTranslit(const tocode, fromcode: Ansistring): iconv_t; function SynaIconvOpenTranslit(const tocode, fromcode: AnsiString): iconv_t;
function SynaIconvOpenIgnore(const tocode, fromcode: Ansistring): iconv_t; function SynaIconvOpenIgnore(const tocode, fromcode: AnsiString): iconv_t;
function SynaIconv(cd: iconv_t; inbuf: AnsiString; var outbuf: AnsiString): integer; function SynaIconv(cd: iconv_t; inbuf: AnsiString; var outbuf: AnsiString): integer;
function SynaIconvClose(var cd: iconv_t): integer; function SynaIconvClose(var cd: iconv_t): integer;
function SynaIconvCtl(cd: iconv_t; request: integer; argument: argptr): integer; function SynaIconvCtl(cd: iconv_t; request: integer; argument: argptr): integer;
@ -152,7 +152,7 @@ uses SyncObjs;
{$ELSE} {$ELSE}
type type
Ticonv_open = function(tocode: pAnsichar; fromcode: pAnsichar): iconv_t; cdecl; Ticonv_open = function(tocode: PAnsiChar; fromcode: PAnsiChar): iconv_t; cdecl;
Ticonv = function(cd: iconv_t; var inbuf: pointer; var inbytesleft: size_t; Ticonv = function(cd: iconv_t; var inbuf: pointer; var inbytesleft: size_t;
var outbuf: pointer; var outbytesleft: size_t): size_t; cdecl; var outbuf: pointer; var outbytesleft: size_t): size_t; cdecl;
Ticonv_close = function(cd: iconv_t): integer; cdecl; Ticonv_close = function(cd: iconv_t): integer; cdecl;
@ -169,7 +169,7 @@ var
IconvCS: TCriticalSection; IconvCS: TCriticalSection;
Iconvloaded: boolean = false; Iconvloaded: boolean = false;
function SynaIconvOpen (const tocode, fromcode: Ansistring): iconv_t; function SynaIconvOpen (const tocode, fromcode: AnsiString): iconv_t;
begin begin
{$IFDEF CIL} {$IFDEF CIL}
try try
@ -186,12 +186,12 @@ begin
{$ENDIF} {$ENDIF}
end; end;
function SynaIconvOpenTranslit (const tocode, fromcode: Ansistring): iconv_t; function SynaIconvOpenTranslit (const tocode, fromcode: AnsiString): iconv_t;
begin begin
Result := SynaIconvOpen(tocode + '//IGNORE//TRANSLIT', fromcode); Result := SynaIconvOpen(tocode + '//IGNORE//TRANSLIT', fromcode);
end; end;
function SynaIconvOpenIgnore (const tocode, fromcode: Ansistring): iconv_t; function SynaIconvOpenIgnore (const tocode, fromcode: AnsiString): iconv_t;
begin begin
Result := SynaIconvOpen(tocode + '//IGNORE', fromcode); Result := SynaIconvOpen(tocode + '//IGNORE', fromcode);
end; end;
@ -296,10 +296,10 @@ begin
if (IconvLibHandle <> 0) then if (IconvLibHandle <> 0) then
begin begin
{$IFNDEF CIL} {$IFNDEF CIL}
_iconv_open := GetProcAddress(IconvLibHandle, PAnsiChar(AnsiString('libiconv_open'))); _iconv_open := GetProcAddress(IconvLibHandle, PChar('libiconv_open'));
_iconv := GetProcAddress(IconvLibHandle, PAnsiChar(AnsiString('libiconv'))); _iconv := GetProcAddress(IconvLibHandle, PChar('libiconv'));
_iconv_close := GetProcAddress(IconvLibHandle, PAnsiChar(AnsiString('libiconv_close'))); _iconv_close := GetProcAddress(IconvLibHandle, PChar('libiconv_close'));
_iconvctl := GetProcAddress(IconvLibHandle, PAnsiChar(AnsiString('libiconvctl'))); _iconvctl := GetProcAddress(IconvLibHandle, PChar('libiconvctl'));
{$ENDIF} {$ENDIF}
Result := True; Result := True;
Iconvloaded := True; Iconvloaded := True;