Ver código fonte

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

git-svn-id: trunk@47633 -
ondrej 4 anos atrás
pai
commit
6854f171d1
1 arquivos alterados com 21 adições e 4 exclusões
  1. 21 4
      rtl/unix/cwstring.pp

+ 21 - 4
rtl/unix/cwstring.pp

@@ -208,6 +208,8 @@ 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'];
 
@@ -240,13 +242,19 @@ begin
   else
     { default to UTF-8 on Unix platforms }
     iconvname:='UTF-8';
-  iconv_wide2ansi:=iconv_open(pchar(iconvname+'//TRANSLIT'),unicode_encoding2);
+  iconv_wide2ansi:=iconv_open(pchar(iconvname),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//TRANSLIT',unicode_encoding2);
+  iconv_wide2ansi:=iconv_open('UTF-8',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;
 
 
@@ -294,7 +302,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+'//TRANSLIT'),otherencoding);
+        open_iconv_for_cps:=iconv_open(pchar(UnixCpMap[iconvindex].name),otherencoding);
       inc(iconvindex);
     until (open_iconv_for_cps<>iconv_t(-1)) or
           (iconvindex>high(UnixCpMap)) or
@@ -318,6 +326,7 @@ 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;
@@ -348,6 +357,12 @@ 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 }
@@ -1123,10 +1138,12 @@ initialization
   { (some OSes do this automatically, but e.g. Darwin and Solaris don't)    }
   setlocale(LC_ALL,'');
 
-  { load iconv library }
+  { load iconvctl function }
   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);