Browse Source

* cwstring: open iconv with the transliterate flag instead of setting it later with iconvctl because it may be unavailable

git-svn-id: trunk@47631 -
ondrej 4 years ago
parent
commit
91229dcee9
1 changed files with 10 additions and 27 deletions
  1. 10 27
      rtl/unix/cwstring.pp

+ 10 - 27
rtl/unix/cwstring.pp

@@ -208,8 +208,6 @@ function iconv_close(__cd:iconv_t):cint;cdecl;external libiconvname name 'libico
 const
   iconvctlname='libiconvctl';
 {$endif}
-var 
-  iconvctl:function(__cd:iconv_t; __request:cint; __argument:pointer):cint;cdecl;
 
 procedure fpc_rangeerror; [external name 'FPC_RANGEERROR'];
 
@@ -242,19 +240,13 @@ begin
   else
     { default to UTF-8 on Unix platforms }
     iconvname:='UTF-8';
-  iconv_wide2ansi:=iconv_open(pchar(iconvname),unicode_encoding2);
+  iconv_wide2ansi:=iconv_open(pchar(iconvname+'//TRANSLIT'),unicode_encoding2);
   iconv_ansi2wide:=iconv_open(unicode_encoding2,pchar(iconvname));
 {$else}
   { Unix locale settings are ignored on iPhoneOS/iPhoneSimulator }
-  iconv_wide2ansi:=iconv_open('UTF-8',unicode_encoding2);
+  iconv_wide2ansi:=iconv_open('UTF-8//TRANSLIT',unicode_encoding2);
   iconv_ansi2wide:=iconv_open(unicode_encoding2,'UTF-8');
 {$endif}
-  if assigned(iconvctl) and
-     (iconv_wide2ansi<>iconv_t(-1)) then
-  begin
-    transliterate:=1;
-    iconvctl(iconv_wide2ansi,ICONV_SET_TRANSLITERATE,@transliterate);
-  end;
 end;
 
 
@@ -302,7 +294,7 @@ function open_iconv_for_cps(cp: TSystemCodePage; const otherencoding: pchar; cp_
       if cp_is_from then
         open_iconv_for_cps:=iconv_open(otherencoding,pchar(UnixCpMap[iconvindex].name))
       else
-        open_iconv_for_cps:=iconv_open(pchar(UnixCpMap[iconvindex].name),otherencoding);
+        open_iconv_for_cps:=iconv_open(pchar(UnixCpMap[iconvindex].name+'//TRANSLIT'),otherencoding);
       inc(iconvindex);
     until (open_iconv_for_cps<>iconv_t(-1)) or
           (iconvindex>high(UnixCpMap)) or
@@ -326,7 +318,6 @@ procedure Wide2AnsiMove(source:pwidechar; var dest:RawByteString; cp:TSystemCode
     mynil : pchar;
     my0 : size_t;
     err : longint;
-    transliterate: cint;
     free_iconv: boolean;
 {$ifdef aix}
     intermediate: rawbytestring;
@@ -357,12 +348,6 @@ procedure Wide2AnsiMove(source:pwidechar; var dest:RawByteString; cp:TSystemCode
     else
       begin
         use_iconv:=open_iconv_for_cps(cp,unicode_encoding2,false);
-        if (use_iconv<>iconv_t(-1)) and
-           assigned(iconvctl) then
-        begin
-          transliterate:=1;
-          iconvctl(use_iconv,ICONV_SET_TRANSLITERATE,@transliterate);
-        end;
         free_iconv:=true;
       end;
     { unsupported encoding -> default move }
@@ -771,19 +756,19 @@ function CompareWideString(const s1, s2 : WideString; Options : TCompareOptions)
   var
     hs1,hs2 : UCS4String;
     us1,us2 : WideString;
-    
+
   begin
     { wcscoll interprets null chars as end-of-string -> filter out }
     if coIgnoreCase in Options then
       begin
       us1:=UpperWideString(s1);
       us2:=UpperWideString(s2);
-      end     
-    else      
-      begin   
+      end
+    else
+      begin
       us1:=s1;
       us2:=s2;
-      end;  
+      end;
     hs1:=WideStringToUCS4StringNoNulls(us1);
     hs2:=WideStringToUCS4StringNoNulls(us2);
     result:=wcscoll(pwchar_t(hs1),pwchar_t(hs2));
@@ -804,7 +789,7 @@ function CompareWideString(const s1, s2 : WideString; Options : TCompareOptions)
       begin
       us1:=s1;
       us2:=s2;
-      end;  
+      end;
     len:=length(us1);
     setlength(hs1,len+1);
     for i:=1 to len do
@@ -1138,12 +1123,10 @@ initialization
   { (some OSes do this automatically, but e.g. Darwin and Solaris don't)    }
   setlocale(LC_ALL,'');
 
-  { load iconvctl function }
+  { load iconv library }
   iconvlib:=LoadLibrary(libprefix+libiconvname+'.'+SharedSuffix);
   if iconvlib=0 then
     iconvlib:=LoadLibrary(libprefix+libiconvname+'.'+SharedSuffix+'.6');
-  if iconvlib<>0 then
-    pointer(iconvctl):=GetProcAddress(iconvlib,iconvctlname);
 
   { set the DefaultSystemCodePage }
   DefaultSystemCodePage:=GetStandardCodePage(scpAnsi);