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