[fpc-pascal] charset conversion
Rimgaudas Laucius
rimga at ktl.mii.lt
Thu Dec 7 19:18:07 CET 2006
>> 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.
More information about the fpc-pascal
mailing list