home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Multimed / Multimed.zip / mp3osr05.zip / src / codepage.pas < prev    next >
Pascal/Delphi Source File  |  1999-12-27  |  9KB  |  244 lines

  1. (*
  2.  * work with codepages
  3.  *  (c) 1999 by Alexander Trunov, 2:5069/10, jnc@mail.ru
  4.  *)
  5.  
  6. unit Codepage;
  7.  
  8. interface
  9.  
  10. const
  11.   cpWin = 01;
  12.   cpAlt = 02;
  13.   cpKoi = 03;
  14.  
  15. function DetermineCodepage(const st: string): Byte;
  16. function Alt2Win(const st: string): string;
  17. function Win2Alt(const st: string): string;
  18. function Alt2Koi(const st: string): string;
  19. function Koi2Alt(const st: string): string;
  20. function Win2Koi(const st: string): string;
  21. function Koi2Win(const st: string): string;
  22. function X2Y(const st: string; srcCp, dstCp: Byte): string;
  23.  
  24. implementation
  25.  
  26. const
  27.   AltSet = ['Ç'..'ƒ', 'á'..'»', 'α'..'∩'];
  28.   KoiSet = ['┴'..'╨', '╥'..'╤'];
  29.   WinSet = ['α'..'∩', '≡'..#255];
  30.  
  31.   Win2AltTable: array[0..255] of Byte = (
  32.     $00, $01, $02, $03, $04, $05, $06, $07, $08, $20, $0A, $0B, $0C, $0D, $0E, $0F,
  33.     $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F,
  34.     $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F,
  35.     $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A, $3B, $3C, $3D, $3E, $3F,
  36.     $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4A, $4B, $4C, $4D, $4E, $4F,
  37.     $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $5A, $5B, $5C, $5D, $5E, $5F,
  38.     $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F,
  39.     $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $7B, $7C, $7D, $7E, $7F,
  40.     $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,
  41.     $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,
  42.     $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $22, $AC, $AD, $AE, $AF,
  43.     $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $FC, $BA, $22, $BC, $BD, $BE, $BF,
  44.     $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,
  45.     $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,
  46.     $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF,
  47.     $E0, $E1, $E2, $E3, $E4, $E5, $E6, $E7, $E8, $E9, $EA, $EB, $EC, $ED, $EE, $EF);
  48.  
  49.   Alt2WinTable: array[0..255] of Byte = (
  50.     $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0D, $0E, $0F,
  51.     $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F,
  52.     $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F,
  53.     $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A, $3B, $3C, $3D, $3E, $3F,
  54.     $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4A, $4B, $4C, $4D, $4E, $4F,
  55.     $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $5A, $5B, $5C, $5D, $5E, $5F,
  56.     $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F,
  57.     $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $7B, $7C, $7D, $7E, $7F,
  58.     $C0, $C1, $C2, $C3, $C4, $C5, $C6, $C7, $C8, $C9, $CA, $CB, $CC, $CD, $CE, $CF,
  59.     $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7, $D8, $D9, $DA, $DB, $DC, $DD, $DE, $DF,
  60.     $E0, $E1, $E2, $E3, $E4, $E5, $E6, $E7, $E8, $E9, $EA, $EB, $EC, $ED, $EE, $EF,
  61.     $20, $20, $20, $A6, $A6, $A6, $A6, $2B, $2B, $A6, $A6, $2B, $2B, $2B, $2B, $2B,
  62.     $2B, $2D, $2D, $2B, $2D, $2B, $A6, $A6, $2B, $2B, $2D, $2D, $A6, $2D, $2B, $2D,
  63.     $2D, $2D, $2D, $2B, $2B, $2B, $2B, $2B, $2B, $2B, $2B, $5F, $5F, $5F, $5F, $5F,
  64.     $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, $F8, $F9, $FA, $FB, $FC, $FD, $FE, $FF,
  65.     $A8, $B8, $AA, $BA, $AF, $BF, $A1, $A2, $B0, $B7, $B7, $5F, $B9, $A4, $5F, $5F);
  66.  
  67.   Koi2AltTable: array[0..255] of Byte = (
  68.     $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0D, $0E, $0F,
  69.     $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F,
  70.     $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F,
  71.     $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A, $3B, $3C, $3D, $3E, $3F,
  72.     $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4A, $4B, $4C, $4D, $4E, $4F,
  73.     $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $5A, $5B, $5C, $5D, $5E, $5F,
  74.     $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F,
  75.     $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $7B, $7C, $7D, $7E, $7F,
  76.     $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,
  77.     $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,
  78.     $A0, $A1, $A2, $A5, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF,
  79.     $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB, $BC, $BD, $BE, $BF,
  80.     $EE, $A0, $A1, $E6, $A4, $A5, $E4, $A3, $E5, $A8, $A9, $AA, $AB, $AC, $AD, $AE,
  81.     $AF, $EF, $E0, $E1, $E2, $E3, $A6, $A2, $EC, $EB, $A7, $E8, $ED, $E9, $E7, $EA,
  82.     $9E, $80, $81, $96, $84, $85, $94, $83, $95, $88, $89, $8A, $8B, $8C, $8D, $8E,
  83.     $8F, $9F, $90, $91, $92, $93, $86, $82, $9C, $9B, $87, $98, $9D, $99, $97, $FF);
  84.  
  85.   Alt2KoiTable: array[0..255] of Byte = (
  86.     $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0D, $0E, $0F,
  87.     $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F,
  88.     $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F,
  89.     $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A, $3B, $3C, $3D, $3E, $3F,
  90.     $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4A, $4B, $4C, $4D, $4E, $4F,
  91.     $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $5A, $5B, $5C, $5D, $5E, $5F,
  92.     $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F,
  93.     $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $7B, $7C, $7D, $7E, $7F,
  94.     $E1, $E2, $F7, $E7, $E4, $E5, $F6, $FA, $E9, $EA, $EB, $EC, $ED, $EE, $EF, $F0,
  95.     $F2, $F3, $F4, $F5, $E6, $E8, $E3, $FE, $FB, $FD, $9A, $F9, $F8, $FC, $E0, $F1,
  96.     $C1, $C2, $D7, $C7, $C4, $C5, $D6, $DA, $C9, $CA, $CB, $CC, $CD, $CE, $CF, $D0,
  97.     $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB, $BC, $BD, $BE, $BF,
  98.     $C0, $C1, $C2, $C3, $C4, $C5, $C6, $C7, $C8, $C9, $CA, $CB, $CC, $CD, $CE, $CF,
  99.     $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7, $D8, $D9, $DA, $DB, $DC, $DD, $DE, $DF,
  100.     $D2, $D3, $D4, $D5, $C6, $C8, $C3, $DE, $DB, $DD, $DF, $D9, $D8, $DC, $C0, $D1,
  101.     $85, $A3, $F2, $F3, $F4, $F5, $F6, $F7, $F8, $F9, $FA, $FB, $FC, $FD, $FE, $FF);
  102.  
  103. function X2Y(const st: string; srcCp, dstCp: Byte): string;
  104. begin
  105.   case srcCp of
  106.     cpWin:
  107.       begin
  108.         case dstCp of
  109.           cpWin:
  110.             begin
  111.               Result := st;
  112.             end;
  113.           cpAlt:
  114.             begin
  115.               Result := Win2Alt(st);
  116.             end;
  117.           cpKoi:
  118.             begin
  119.               Result := Win2Koi(st);
  120.             end;
  121.         end;
  122.       end;
  123.     cpAlt:
  124.       begin
  125.         case dstCp of
  126.           cpWin:
  127.             begin
  128.               Result := Alt2Win(st);
  129.             end;
  130.           cpAlt:
  131.             begin
  132.               Result := st;
  133.             end;
  134.           cpKoi:
  135.             begin
  136.               Result := Alt2Koi(st);
  137.             end;
  138.         end;
  139.       end;
  140.     cpKoi:
  141.       begin
  142.         case dstCp of
  143.           cpWin:
  144.             begin
  145.               Result := Koi2Win(st);
  146.             end;
  147.           cpAlt:
  148.             begin
  149.               Result := Koi2Alt(st);
  150.             end;
  151.           cpKoi:
  152.             begin
  153.               Result := st;
  154.             end;
  155.         end;
  156.       end;
  157.   end;
  158. end;
  159.  
  160. function Win2Koi(const st: string): string;
  161. begin
  162.   Result := Alt2Koi(Win2Alt(st));
  163. end;
  164.  
  165. function Koi2Win(const st: string): string;
  166. begin
  167.   Result := Alt2Win(Koi2Alt(st));
  168. end;
  169.  
  170. function Alt2Win(const st: string): string;
  171. var
  172.   i: Integer;
  173. begin
  174.   Alt2Win[0] := Char(Length(st));
  175.   for i := 1 to Length(st) do
  176.   begin
  177.     Alt2Win[i] := Char(Alt2WinTable[Byte(st[i])]);
  178.   end;
  179. end;
  180.  
  181. function Win2Alt(const st: string): string;
  182. var
  183.   i: Integer;
  184. begin
  185.   Win2Alt[0] := Char(Length(st));
  186.   for i := 1 to Length(st) do
  187.   begin
  188.     Win2Alt[i] := Char(Win2AltTable[Byte(st[i])]);
  189.   end;
  190. end;
  191.  
  192. function Alt2Koi(const st: string): string;
  193. var
  194.   i: Integer;
  195. begin
  196.   Alt2Koi[0] := Char(Length(st));
  197.   for i := 1 to Length(st) do
  198.   begin
  199.     Alt2Koi[i] := Char(Alt2KoiTable[Byte(st[i])]);
  200.   end;
  201. end;
  202.  
  203. function Koi2Alt(const st: string): string;
  204. var
  205.   i: Integer;
  206. begin
  207.   Koi2Alt[0] := Char(Length(st));
  208.   for i := 1 to Length(st) do
  209.   begin
  210.     Koi2Alt[i] := Char(Koi2AltTable[Byte(st[i])]);
  211.   end;
  212. end;
  213.  
  214. function DetermineCodepage(const st: string): Byte;
  215. var
  216.   WinCount,
  217.     AltCount,
  218.     KoiCount,
  219.     i, rslt: Integer;
  220. begin
  221.   DetermineCodepage := cpAlt;
  222.   WinCount := 0;
  223.   AltCount := 0;
  224.   KoiCount := 0;
  225.   for i := 1 to Length(st) do
  226.   begin
  227.     if st[i] in AltSet then Inc(AltCount);
  228.     if st[i] in WinSet then Inc(WinCount);
  229.     if st[i] in KoiSet then Inc(KoiCount);
  230.   end;
  231.   DetermineCodepage := cpAlt;
  232.   if KoiCount > AltCount then
  233.   begin
  234.     DetermineCodepage := cpKoi;
  235.     if WinCount > KoiCount then DetermineCodepage := cpWin;
  236.   end
  237.   else
  238.   begin
  239.     if WinCount > AltCount then DetermineCodepage := cpWin;
  240.   end;
  241. end;
  242.  
  243. end.
  244.