mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 05:00:12 +02:00
rtl: transliterate characters if possible intead of replacing them with "?" chars while converting between codepages
git-svn-id: trunk@19522 -
This commit is contained in:
parent
3b3f1ac8a5
commit
5d7d143300
@ -134,6 +134,15 @@ const
|
||||
{ breaks backwards compatibility every now and then }
|
||||
MB_CUR_MAX = 10;
|
||||
|
||||
{ Requests for iconvctl }
|
||||
ICONV_TRIVIALP = 0; // int *argument
|
||||
ICONV_GET_TRANSLITERATE = 1; // int *argument
|
||||
ICONV_SET_TRANSLITERATE = 2; // const int *argument
|
||||
ICONV_GET_DISCARD_ILSEQ = 3; // int *argument
|
||||
ICONV_SET_DISCARD_ILSEQ = 4; // const int *argument
|
||||
ICONV_SET_HOOKS = 5; // const struct iconv_hooks *argument
|
||||
ICONV_SET_FALLBACKS = 6; // const struct iconv_fallbacks *argument
|
||||
|
||||
type
|
||||
piconv_t = ^iconv_t;
|
||||
iconv_t = pointer;
|
||||
@ -151,10 +160,12 @@ type
|
||||
function iconv_open(__tocode:pchar; __fromcode:pchar):iconv_t;cdecl;external libiconvname name 'iconv_open';
|
||||
function iconv(__cd:iconv_t; __inbuf:ppchar; __inbytesleft:psize_t; __outbuf:ppchar; __outbytesleft:psize_t):size_t;cdecl;external libiconvname name 'iconv';
|
||||
function iconv_close(__cd:iconv_t):cint;cdecl;external libiconvname name 'iconv_close';
|
||||
function iconvctl(__cd:iconv_t; __request:cint; __argument:pointer):cint;cdecl;external libiconvname name 'iconvctl';
|
||||
{$else}
|
||||
function iconv_open(__tocode:pchar; __fromcode:pchar):iconv_t;cdecl;external libiconvname name 'libiconv_open';
|
||||
function iconv(__cd:iconv_t; __inbuf:ppchar; __inbytesleft:psize_t; __outbuf:ppchar; __outbytesleft:psize_t):size_t;cdecl;external libiconvname name 'libiconv';
|
||||
function iconv_close(__cd:iconv_t):cint;cdecl;external libiconvname name 'libiconv_close';
|
||||
function iconvctl(__cd:iconv_t; __request:cint; __argument:pointer):cint;cdecl;external libiconvname name 'libiconvctl';
|
||||
{$endif}
|
||||
|
||||
procedure fpc_rangeerror; [external name 'FPC_RANGEERROR'];
|
||||
@ -179,6 +190,7 @@ procedure InitThread;
|
||||
{$if not(defined(darwin) and defined(arm))}
|
||||
var
|
||||
iconvname: rawbytestring;
|
||||
transliterate: cint;
|
||||
{$endif}
|
||||
begin
|
||||
current_DefaultSystemCodePage:=DefaultSystemCodePage;
|
||||
@ -191,6 +203,8 @@ begin
|
||||
iconv_wide2ansi:=iconv_open('UTF-8',unicode_encoding2);
|
||||
iconv_ansi2wide:=iconv_open(unicode_encoding2,'UTF-8');
|
||||
{$endif}
|
||||
transliterate:=1;
|
||||
iconvctl(iconv_wide2ansi,ICONV_SET_TRANSLITERATE,@transliterate);
|
||||
end;
|
||||
|
||||
|
||||
@ -233,7 +247,8 @@ procedure Wide2AnsiMove(source:pwidechar; var dest:RawByteString; cp:TSystemCode
|
||||
destpos: pchar;
|
||||
mynil : pchar;
|
||||
my0 : size_t;
|
||||
err: cint;
|
||||
err,
|
||||
transliterate: cint;
|
||||
free_iconv: boolean;
|
||||
begin
|
||||
if (cp=DefaultSystemCodePage) then
|
||||
@ -257,6 +272,8 @@ procedure Wide2AnsiMove(source:pwidechar; var dest:RawByteString; cp:TSystemCode
|
||||
unsafe normally, but these are constant strings -> no
|
||||
problem }
|
||||
use_iconv:=iconv_open(pchar(win2iconv(cp)),unicode_encoding2);
|
||||
transliterate:=1;
|
||||
iconvctl(use_iconv,ICONV_SET_TRANSLITERATE,@transliterate);
|
||||
free_iconv:=true;
|
||||
end;
|
||||
{ unsupported encoding -> default move }
|
||||
|
Loading…
Reference in New Issue
Block a user