On MS Windows, I found WideCharToMultiByte and MultiByteToWideChar,
which take a numerical CodePage as parameter. But I don't know how to
map a charset name ('UTF-8', 'Latin-1', 'ISO-8859-15'...) to a CodePage
(any hint ?).


Hi,

I attached conversion fpc program i had written earlier. Maybe you will find
something usefull in it.



{$mode delphi}
uses
 windows, sysutils, classes, koduotes;


var
 w: widestring;
 p: string;
 l: integer;
 s: string;
 cp: string;
 cp2: string;
 st: TFileStream;
 tf: string;


begin
 cp:= paramstr(1);
 s:= paramstr(2);
 cp2:= paramstr(3);
 tf:= paramstr(4);

 if (not FileExists(s)) or (cp='') or (cp2='') or (tf='') then
 begin
   writeln('Naudojimas: koduok.exe koduote1 duomenu_failas koduote2
rezultatu_failas');
   writeln('Galimos koduote1 ir koduote2 reiksmes: ');
   Israsyk_Koduotes;
   exit;
 end;

 st:= TFileStream.Create(s, fmOpenRead);
 try
   setlength(p, st.size);
   l:= st.size;
   if st.size=0 then
   begin
     Writeln('Nera ko kuoduoti');
     Exit;
   end;
   st.read(p[1], st.size);
 finally
   st.free;
 end;

 setlength(w, l);
 l:= multibytetowidechar(strtoint(cp), 0, pchar(p), l, pwidechar(w), l);
 setlength(w, l);
 if l=0 then
 begin
   Writeln('Nieko neperkoduota');
   Exit;
 end;

 setlength(p, l*4);
 l:= widechartomultibyte(strtoint(cp2), 0, pwidechar(w), l, pchar(p), l*4,
nil,nil);
 setlength(p, l);
 if l=0 then
 begin
   Writeln('Nieko neperkoduota 2');
   Exit;
 end;

 st:= TFileStream.Create(tf, fmCreate);
 try
   st.write(p[1], l);
 finally
   st.free;
 end;
end.

{$mode delphi}
unit koduotes;
interface
uses
 classes, sysutils, windows;

const
_037  = 'IBM EBCDIC - U.S./Canada';
_437  = 'DOS - United States';
_500  = 'IBM EBCDIC - International';
_708  = 'Arabic - ASMO 708';
_709  = 'Arabic - ASMO 449+, BCON V4';
_710  = 'Arabic - Transparent Arabic';
_720  = 'Arabic - Transparent ASMO';
_737  = 'DOS 737- Graiku (formerly 437G)';
_775  = 'DOS 775 - Baltijos saliu';
_850  = 'DOS 850 - Multilingual Latin I';
_852  = 'DOS 852 - Latin II';
_855  = 'DOS 855 - Kirilica (primarily Russian)';
_857  = 'DOS 857 - Turku';
_858  = 'DOS 858 - Multlingual Latin I + Euro symbol';
_860  = 'DOS 860 - Portugalu';
_861  = 'DOS 861 - Islandijos';
_862  = 'DOS 862 - Hebraju';
_863  = 'DOS 863 - Kanados-prancuzu';
_864  = 'DOS 864 - Arabu';
_865  = 'DOS 865 - Nordic';
_866  = 'DOS 866 - Rusu';
_869  = 'DOS 869 - Modern Greek';
_870  = 'IBM EBCDIC 870 - Multilingual/ROECE (Latin-2)';
_874  = 'Windows/DOS 874 - Thai (same as 28605, ISO 8859-15)';
_875  = 'IBM EBCDIC 875 - Modern Greek';
_932  = 'Windows/DOS 932 - Japanese, Shift-JIS';
_936  = 'Windows/DOS 936 - Simplified Chinese (PRC, Singapore)';
_949  = 'Windows/DOS 949 - Korean (Unified Hangeul Code)';
_950  = 'Windows/DOS 950 - Traditional Chinese (Taiwan; Hong Kong SAR,
PRC)';
_1026  = 'IBM EBCDIC 1026 - Turkish (Latin-5)';
_1047  = 'IBM EBCDIC 1047 - Latin 1/Open System';
_1140  = 'IBM EBCDIC 1140 - U.S./Canada (037 + Euro symbol)';
_1141  = 'IBM EBCDIC 1141 - Germany (20273 + Euro symbol)';
_1142  = 'IBM EBCDIC 1142 - Denmark/Norway (20277 + Euro symbol)';
_1143  = 'IBM EBCDIC 1143 - Finland/Sweden (20278 + Euro symbol)';
_1144  = 'IBM EBCDIC 1144 - Italy (20280 + Euro symbol)';
_1145  = 'IBM EBCDIC 1145 - Latin America/Spain (20284 + Euro symbol)';
_1146  = 'IBM EBCDIC 1146 - United Kingdom (20285 + Euro symbol)';
_1147  = 'IBM EBCDIC 1147 - France (20297 + Euro symbol)';
_1148  = 'IBM EBCDIC 1148 - International (500 + Euro symbol)';
_1149  = 'IBM EBCDIC 1149 - Icelandic (20871 + Euro symbol)';
_1200  = 'Unicode UCS-2 Little-Endian (BMP of ISO 10646)';
_1201  = 'Unicode UCS-2 Big-Endian';
_1250  = 'Windows 1250- Vidurio Europos';
_1251  = 'Windows 1251- Kirilica';
_1252  = 'Windows 1252- Latin I';
_1253  = 'Windows 1253- Graiku';
_1254  = 'Windows 1254- Turku';
_1255  = 'Windows 1255- Hebraju';
_1256  = 'Windows 1256- Arabu';
_1257  = 'Windows 1257- Baltijos saliu';
_1258  = 'Windows/DOS 1258 - Vietnamieciu';
_1361  = 'Korean (Johab)';
_10000  = 'MAC 10000- Roman';
_10001  = 'MAC 10001- Japanese';
_10002  = 'MAC 10002- Traditional Chinese (Big5)';
_10003  = 'MAC 10003- Korean';
_10004  = 'MAC 10004- Arabic';
_10005  = 'MAC 10005- Hebrew';
_10006  = 'MAC 10006- Greek I';
_10007  = 'MAC 10007- Cyrillic';
_10008  = 'MAC 10008- Simplified Chinese (GB 2312)';
_10010  = 'MAC 10010- Romania';
_10017  = 'MAC 10017- Ukraine';
_10021  = 'MAC 10021- Thai';
_10029  = 'MAC 10029- Latin II';
_10079  = 'MAC 10079- Icelandic';
_10081  = 'MAC 10081- Turkish';
_10082  = 'MAC 10082- Croatia';
_12000  = 'Unicode UCS-4 Little-Endian';
_12001  = 'Unicode UCS-4 Big-Endian';
_20000  = 'CNS - Taiwan';
_20001  = 'TCA - Taiwan';
_20002  = 'Eten - Taiwan';
_20003  = 'IBM5550 - Taiwan';
_20004  = 'TeleText - Taiwan';
_20005  = 'Wang - Taiwan';
_20105  = 'IA5 IRV International Alphabet No. 5 (7-bit)';
_20106  = 'IA5 German (7-bit)';
_20107  = 'IA5 Swedish (7-bit)';
_20108  = 'IA5 Norwegian (7-bit)';
_20127  = 'US-ASCII (7-bit)';
_20261  = 'T.61';
_20269  = 'ISO 6937 Non-Spacing Accent';
_20273  = 'IBM EBCDIC - Germany';
_20277  = 'IBM EBCDIC - Denmark/Norway';
_20278  = 'IBM EBCDIC - Finland/Sweden';
_20280  = 'IBM EBCDIC - Italy';
_20284  = 'IBM EBCDIC - Latin America/Spain';
_20285  = 'IBM EBCDIC - United Kingdom';
_20290  = 'IBM EBCDIC - Japanese Katakana Extended';
_20297  = 'IBM EBCDIC - France';
_20420  = 'IBM EBCDIC - Arabic';
_20423  = 'IBM EBCDIC - Greek';
_20424  = 'IBM EBCDIC - Hebrew';
_20833  = 'IBM EBCDIC - Korean Extended';
_20838  = 'IBM EBCDIC - Thai';
_20866  = 'Russian - KOI8-R';
_20871  = 'IBM EBCDIC - Icelandic';
_20880  = 'IBM EBCDIC - Cyrillic (Russian)';
_20905  = 'IBM EBCDIC - Turkish';
_20924  = 'IBM EBCDIC - Latin-1/Open System (1047 + Euro symbol)';
_20932  = 'JIS X 0208-1990 & 0121-1990';
_20936  = 'Simplified Chinese (GB2312)';
_20949  = 'x-cp20949 Korean Wansung';
_21025  = 'IBM EBCDIC - Cyrillic (Serbian, Bulgarian)';
_21027  = 'Extended Alpha Lowercase';
_21866  = 'Ukrainian (KOI8-U)';
_28591  = 'ISO 8859-1 Latin I';
_28592  = 'ISO 8859-2 Vidurio Europos';
_28593  = 'ISO 8859-3 Latin 3';
_28594  = 'ISO 8859-4 Baltijos saliu';
_28595  = 'ISO 8859-5 Kirilica';
_28596  = 'ISO 8859-6 Arabu';
_28597  = 'ISO 8859-7 Graiku';
_28598  = 'ISO 8859-8 Hebraju';
_28599  = 'ISO 8859-9 Latin 5';
_28600  = 'ISO 8859-10';
_28601  = 'ISO 8859-11';
_28602  = 'ISO 8859-12';
_28603  = 'ISO 8859-13 Baltijos saliu';
_28604  = 'ISO 8859-14';
_28605  = 'ISO 8859-15 Latin 9';
_29001  = 'Europa 3';
_38598  = 'ISO 8859-8 Hebrew';
_50220  = 'ISO 2022 Japanese with no halfwidth Katakana';
_50221  = 'ISO 2022 Japanese with halfwidth Katakana';
_50222  = 'ISO 2022 Japanese JIS X 0201-1989';
_50225  = 'ISO 2022 Korean';
_50227  = 'ISO 2022 Simplified Chinese';
_50229  = 'ISO 2022 Traditional Chinese';
_50930  = 'Japanese (Katakana) Extended';
_50931  = 'US/Canada and Japanese';
_50933  = 'Korean Extended and Korean';
_50935  = 'Simplified Chinese Extended and Simplified Chinese';
_50936  = 'Simplified Chinese';
_50937  = 'US/Canada and Traditional Chinese';
_50939  = 'Japanese (Latin) Extended and Japanese';
_51932  = 'EUC - Japanese';
_51936  = 'EUC - Simplified Chinese';
_51949  = 'EUC - Korean';
_51950  = 'EUC - Traditional Chinese';
_52936  = 'HZ-GB2312 Simplified Chinese';
_54936  = 'Windows XP: GB18030 Simplified Chinese (4 Byte)';
_57002  = 'ISCII Devanagari';
_57003  = 'ISCII Bengali';
_57004  = 'ISCII Tamil';
_57005  = 'ISCII Telugu';
_57006  = 'ISCII Assamese';
_57007  = 'ISCII Oriya';
_57008  = 'ISCII Kannada';
_57009  = 'ISCII Malayalam';
_57010  = 'ISCII Gujarati';
_57011  = 'ISCII Punjabi';
_65000  = 'Unicode UTF-7';
_65001  = 'Unicode UTF-8';
cp_str  = 'Nezinoma koduote MS ID: %s';


procedure Israsyk_Koduotes;

var
 cp_list: TStringList;

implementation


function EnumCP(p: pchar): integer; stdcall;
begin
 cp_list.add(string(p));
 result:=1;
end;

procedure Israsyk_Koduotes;
var
 i: integer;
 a: integer;
begin
 for i:= 0 to cp_list.Count-1 do
 begin
   a:= strtoint(cp_list[i]);
   case a of
     037   : writeln(cp_list[i], ' ', _037);
     437   : writeln(cp_list[i], ' ', _437);
     500   : writeln(cp_list[i], ' ', _500);
     708   : writeln(cp_list[i], ' ', _708);
     709   : writeln(cp_list[i], ' ', _709);
     710   : writeln(cp_list[i], ' ', _710);
     720   : writeln(cp_list[i], ' ', _720);
     737   : writeln(cp_list[i], ' ', _737);
     775   : writeln(cp_list[i], ' ', _775);
     850   : writeln(cp_list[i], ' ', _850);
     852   : writeln(cp_list[i], ' ', _852);
     855   : writeln(cp_list[i], ' ', _855);
     857   : writeln(cp_list[i], ' ', _857);
     858   : writeln(cp_list[i], ' ', _858);
     860   : writeln(cp_list[i], ' ', _860);
     861   : writeln(cp_list[i], ' ', _861);
     862   : writeln(cp_list[i], ' ', _862);
     863   : writeln(cp_list[i], ' ', _863);
     864   : writeln(cp_list[i], ' ', _864);
     865   : writeln(cp_list[i], ' ', _865);
     866   : writeln(cp_list[i], ' ', _866);
     869   : writeln(cp_list[i], ' ', _869);
     870   : writeln(cp_list[i], ' ', _870);
     874   : writeln(cp_list[i], ' ', _874);
     875   : writeln(cp_list[i], ' ', _875);
     932   : writeln(cp_list[i], ' ', _932);
     936   : writeln(cp_list[i], ' ', _936);
     949   : writeln(cp_list[i], ' ', _949);
     950   : writeln(cp_list[i], ' ', _950);
     1026  : writeln(cp_list[i], ' ', _1026);
     1047  : writeln(cp_list[i], ' ', _1047);
     1140  : writeln(cp_list[i], ' ', _1140);
     1141  : writeln(cp_list[i], ' ', _1141);
     1142  : writeln(cp_list[i], ' ', _1142);
     1143  : writeln(cp_list[i], ' ', _1143);
     1144  : writeln(cp_list[i], ' ', _1144);
     1145  : writeln(cp_list[i], ' ', _1145);
     1146  : writeln(cp_list[i], ' ', _1146);
     1147  : writeln(cp_list[i], ' ', _1147);
     1148  : writeln(cp_list[i], ' ', _1148);
     1149  : writeln(cp_list[i], ' ', _1149);
     1200  : writeln(cp_list[i], ' ', _1200);
     1201  : writeln(cp_list[i], ' ', _1201);
     1250  : writeln(cp_list[i], ' ', _1250);
     1251  : writeln(cp_list[i], ' ', _1251);
     1252  : writeln(cp_list[i], ' ', _1252);
     1253  : writeln(cp_list[i], ' ', _1253);
     1254  : writeln(cp_list[i], ' ', _1254);
     1255  : writeln(cp_list[i], ' ', _1255);
     1256  : writeln(cp_list[i], ' ', _1256);
     1257  : writeln(cp_list[i], ' ', _1257);
     1258  : writeln(cp_list[i], ' ', _1258);
     1361  : writeln(cp_list[i], ' ', _1361);
     10000 : writeln(cp_list[i], ' ', _10000);
     10001 : writeln(cp_list[i], ' ', _10001);
     10002 : writeln(cp_list[i], ' ', _10002);
     10003 : writeln(cp_list[i], ' ', _10003);
     10004 : writeln(cp_list[i], ' ', _10004);
     10005 : writeln(cp_list[i], ' ', _10005);
     10006 : writeln(cp_list[i], ' ', _10006);
     10007 : writeln(cp_list[i], ' ', _10007);
     10008 : writeln(cp_list[i], ' ', _10008);
     10010 : writeln(cp_list[i], ' ', _10010);
     10017 : writeln(cp_list[i], ' ', _10017);
     10021 : writeln(cp_list[i], ' ', _10021);
     10029 : writeln(cp_list[i], ' ', _10029);
     10079 : writeln(cp_list[i], ' ', _10079);
     10081 : writeln(cp_list[i], ' ', _10081);
     10082 : writeln(cp_list[i], ' ', _10082);
     12000 : writeln(cp_list[i], ' ', _12000);
     12001 : writeln(cp_list[i], ' ', _12001);
     20000 : writeln(cp_list[i], ' ', _20000);
     20001 : writeln(cp_list[i], ' ', _20001);
     20002 : writeln(cp_list[i], ' ', _20002);
     20003 : writeln(cp_list[i], ' ', _20003);
     20004 : writeln(cp_list[i], ' ', _20004);
     20005 : writeln(cp_list[i], ' ', _20005);
     20105 : writeln(cp_list[i], ' ', _20105);
     20106 : writeln(cp_list[i], ' ', _20106);
     20107 : writeln(cp_list[i], ' ', _20107);
     20108 : writeln(cp_list[i], ' ', _20108);
     20127 : writeln(cp_list[i], ' ', _20127);
     20261 : writeln(cp_list[i], ' ', _20261);
     20269 : writeln(cp_list[i], ' ', _20269);
     20273 : writeln(cp_list[i], ' ', _20273);
     20277 : writeln(cp_list[i], ' ', _20277);
     20278 : writeln(cp_list[i], ' ', _20278);
     20280 : writeln(cp_list[i], ' ', _20280);
     20284 : writeln(cp_list[i], ' ', _20284);
     20285 : writeln(cp_list[i], ' ', _20285);
     20290 : writeln(cp_list[i], ' ', _20290);
     20297 : writeln(cp_list[i], ' ', _20297);
     20420 : writeln(cp_list[i], ' ', _20420);
     20423 : writeln(cp_list[i], ' ', _20423);
     20424 : writeln(cp_list[i], ' ', _20424);
     20833 : writeln(cp_list[i], ' ', _20833);
     20838 : writeln(cp_list[i], ' ', _20838);
     20866 : writeln(cp_list[i], ' ', _20866);
     20871 : writeln(cp_list[i], ' ', _20871);
     20880 : writeln(cp_list[i], ' ', _20880);
     20905 : writeln(cp_list[i], ' ', _20905);
     20924 : writeln(cp_list[i], ' ', _20924);
     20932 : writeln(cp_list[i], ' ', _20932);
     20936 : writeln(cp_list[i], ' ', _20936);
     21025 : writeln(cp_list[i], ' ', _21025);
     21027 : writeln(cp_list[i], ' ', _21027);
     21866 : writeln(cp_list[i], ' ', _21866);
     28591 : writeln(cp_list[i], ' ', _28591);
     28592 : writeln(cp_list[i], ' ', _28592);
     28593 : writeln(cp_list[i], ' ', _28593);
     28594 : writeln(cp_list[i], ' ', _28594);
     28595 : writeln(cp_list[i], ' ', _28595);
     28596 : writeln(cp_list[i], ' ', _28596);
     28597 : writeln(cp_list[i], ' ', _28597);
     28598 : writeln(cp_list[i], ' ', _28598);
     28599 : writeln(cp_list[i], ' ', _28599);
     28603 : writeln(cp_list[i], ' ', _28603);
     28605 : writeln(cp_list[i], ' ', _28605);
     29001 : writeln(cp_list[i], ' ', _29001);
     38598 : writeln(cp_list[i], ' ', _38598);
     50220 : writeln(cp_list[i], ' ', _50220);
     50221 : writeln(cp_list[i], ' ', _50221);
     50222 : writeln(cp_list[i], ' ', _50222);
     50225 : writeln(cp_list[i], ' ', _50225);
     50227 : writeln(cp_list[i], ' ', _50227);
     50229 : writeln(cp_list[i], ' ', _50229);
     50930 : writeln(cp_list[i], ' ', _50930);
     50931 : writeln(cp_list[i], ' ', _50931);
     50933 : writeln(cp_list[i], ' ', _50933);
     50935 : writeln(cp_list[i], ' ', _50935);
     50936 : writeln(cp_list[i], ' ', _50936);
     50937 : writeln(cp_list[i], ' ', _50937);
     50939 : writeln(cp_list[i], ' ', _50939);
     51932 : writeln(cp_list[i], ' ', _51932);
     51936 : writeln(cp_list[i], ' ', _51936);
     51949 : writeln(cp_list[i], ' ', _51949);
     51950 : writeln(cp_list[i], ' ', _51950);
     52936 : writeln(cp_list[i], ' ', _52936);
     54936 : writeln(cp_list[i], ' ', _54936);
     57002 : writeln(cp_list[i], ' ', _57002);
     57003 : writeln(cp_list[i], ' ', _57003);
     57004 : writeln(cp_list[i], ' ', _57004);
     57005 : writeln(cp_list[i], ' ', _57005);
     57006 : writeln(cp_list[i], ' ', _57006);
     57007 : writeln(cp_list[i], ' ', _57007);
     57008 : writeln(cp_list[i], ' ', _57008);
     57009 : writeln(cp_list[i], ' ', _57009);
     57010 : writeln(cp_list[i], ' ', _57010);
     57011 : writeln(cp_list[i], ' ', _57011);
     65000 : writeln(cp_list[i], ' ', _65000);
     65001 : writeln(cp_list[i], ' ', _65001);
   else
     Writeln (cp_list[i], ' ', Format(cp_str,[cp_list[i]]));
   end;
 end;
end;

initialization
 cp_list:= TStringList.Create;
 EnumSystemCodePages(@EnumCP, CP_INSTALLED);

finalization
 cp_list.Free;
end.


_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to