home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 November / Chip_2002-11_cd1.bin / zkuste / delphi / kompon / d3456 / SYNAPSE.ZIP / source / lib / SynaChar.pas < prev    next >
Pascal/Delphi Source File  |  2002-07-07  |  49KB  |  1,341 lines

  1. {==============================================================================|
  2. | Project : Delphree - Synapse                                   | 004.000.001 |
  3. |==============================================================================|
  4. | Content: Charset conversion support                                          |
  5. |==============================================================================|
  6. | Copyright (c)1999-2002, Lukas Gebauer                                        |
  7. | All rights reserved.                                                         |
  8. |                                                                              |
  9. | Redistribution and use in source and binary forms, with or without           |
  10. | modification, are permitted provided that the following conditions are met:  |
  11. |                                                                              |
  12. | Redistributions of source code must retain the above copyright notice, this  |
  13. | list of conditions and the following disclaimer.                             |
  14. |                                                                              |
  15. | Redistributions in binary form must reproduce the above copyright notice,    |
  16. | this list of conditions and the following disclaimer in the documentation    |
  17. | and/or other materials provided with the distribution.                       |
  18. |                                                                              |
  19. | Neither the name of Lukas Gebauer nor the names of its contributors may      |
  20. | be used to endorse or promote products derived from this software without    |
  21. | specific prior written permission.                                           |
  22. |                                                                              |
  23. | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  |
  24. | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE    |
  25. | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE   |
  26. | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR  |
  27. | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL       |
  28. | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR   |
  29. | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER   |
  30. | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT           |
  31. | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY    |
  32. | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH  |
  33. | DAMAGE.                                                                      |
  34. |==============================================================================|
  35. | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
  36. | Portions created by Lukas Gebauer are Copyright (c)2000,2001.                |
  37. | All Rights Reserved.                                                         |
  38. |==============================================================================|
  39. | Contributor(s):                                                              |
  40. |==============================================================================|
  41. | History: see HISTORY.HTM from distribution package                           |
  42. |          (Found at URL: http://www.ararat.cz/synapse/)                       |
  43. |==============================================================================}
  44.  
  45. {$Q-}
  46. {$WEAKPACKAGEUNIT ON}
  47.  
  48. unit SynaChar;
  49.  
  50. interface
  51.  
  52. type
  53.   TMimeChar = (ISO_8859_1, ISO_8859_2, ISO_8859_3,
  54.     ISO_8859_4, ISO_8859_5, ISO_8859_6, ISO_8859_7,
  55.     ISO_8859_8, ISO_8859_9, ISO_8859_10, ISO_8859_13,
  56.     ISO_8859_14, ISO_8859_15, CP1250, CP1251, CP1252,
  57.     CP1253, CP1254, CP1255, CP1256, CP1257, CP1258,
  58.     KOI8_R, CP895, CP852, UCS_2, UCS_4, UTF_8, UTF_7);
  59.  
  60.   TMimeSetChar = set of TMimeChar;
  61.  
  62. //character transcoding tables X to UCS-2
  63. {
  64. //dummy table
  65. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  66. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  67. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  68. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  69. $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  70. $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  71. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  72. $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  73. $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  74. $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  75. $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  76. $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  77. $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  78. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  79. $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  80. $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF
  81. }
  82.  
  83. const
  84.  
  85. {Latin-1
  86.   Danish, Dutch, English, Faeroese, Finnish, French, German, Icelandic,
  87.   Irish, Italian, Norwegian, Portuguese, Spanish and Swedish.
  88. }
  89.   CharISO_8859_1: array[128..255] of Word =
  90.   (
  91.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  92.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  93.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  94.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  95.     $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  96.     $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  97.     $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  98.     $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  99.     $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  100.     $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  101.     $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  102.     $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  103.     $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  104.     $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  105.     $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  106.     $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF
  107.     );
  108.  
  109. {Latin-2
  110.   Albanian, Czech, English, German, Hungarian, Polish, Rumanian,
  111.   Serbo-Croatian, Slovak, Slovene and Swedish.
  112. }
  113.   CharISO_8859_2: array[128..255] of Word =
  114.   (
  115.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  116.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  117.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  118.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  119.     $00A0, $0104, $02D8, $0141, $00A4, $013D, $015A, $00A7,
  120.     $00A8, $0160, $015E, $0164, $0179, $00AD, $017D, $017B,
  121.     $00B0, $0105, $02DB, $0142, $00B4, $013E, $015B, $02C7,
  122.     $00B8, $0161, $015F, $0165, $017A, $02DD, $017E, $017C,
  123.     $0154, $00C1, $00C2, $0102, $00C4, $0139, $0106, $00C7,
  124.     $010C, $00C9, $0118, $00CB, $011A, $00CD, $00CE, $010E,
  125.     $0110, $0143, $0147, $00D3, $00D4, $0150, $00D6, $00D7,
  126.     $0158, $016E, $00DA, $0170, $00DC, $00DD, $0162, $00DF,
  127.     $0155, $00E1, $00E2, $0103, $00E4, $013A, $0107, $00E7,
  128.     $010D, $00E9, $0119, $00EB, $011B, $00ED, $00EE, $010F,
  129.     $0111, $0144, $0148, $00F3, $00F4, $0151, $00F6, $00F7,
  130.     $0159, $016F, $00FA, $0171, $00FC, $00FD, $0163, $02D9
  131.     );
  132.  
  133. {Latin-3
  134.   Afrikaans, Catalan, English, Esperanto, French, Galician,
  135.   German, Italian, Maltese and Turkish.
  136. }
  137.   CharISO_8859_3: array[128..255] of Word =
  138.   (
  139.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  140.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  141.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  142.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  143.     $00A0, $0126, $02D8, $00A3, $00A4, $FFFD, $0124, $00A7,
  144.     $00A8, $0130, $015E, $011E, $0134, $00AD, $FFFD, $017B,
  145.     $00B0, $0127, $00B2, $00B3, $00B4, $00B5, $0125, $00B7,
  146.     $00B8, $0131, $015F, $011F, $0135, $00BD, $FFFD, $017C,
  147.     $00C0, $00C1, $00C2, $FFFD, $00C4, $010A, $0108, $00C7,
  148.     $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  149.     $FFFD, $00D1, $00D2, $00D3, $00D4, $0120, $00D6, $00D7,
  150.     $011C, $00D9, $00DA, $00DB, $00DC, $016C, $015C, $00DF,
  151.     $00E0, $00E1, $00E2, $FFFD, $00E4, $010B, $0109, $00E7,
  152.     $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  153.     $FFFD, $00F1, $00F2, $00F3, $00F4, $0121, $00F6, $00F7,
  154.     $011D, $00F9, $00FA, $00FB, $00FC, $016D, $015D, $02D9
  155.     );
  156.  
  157. {Latin-4
  158.   Danish, English, Estonian, Finnish, German, Greenlandic,
  159.   Lappish, Latvian, Lithuanian, Norwegian and Swedish.
  160. }
  161.   CharISO_8859_4: array[128..255] of Word =
  162.   (
  163.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  164.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  165.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  166.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  167.     $00A0, $0104, $0138, $0156, $00A4, $0128, $013B, $00A7,
  168.     $00A8, $0160, $0112, $0122, $0166, $00AD, $017D, $00AF,
  169.     $00B0, $0105, $02DB, $0157, $00B4, $0129, $013C, $02C7,
  170.     $00B8, $0161, $0113, $0123, $0167, $014A, $017E, $014B,
  171.     $0100, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $012E,
  172.     $010C, $00C9, $0118, $00CB, $0116, $00CD, $00CE, $012A,
  173.     $0110, $0145, $014C, $0136, $00D4, $00D5, $00D6, $00D7,
  174.     $00D8, $0172, $00DA, $00DB, $00DC, $0168, $016A, $00DF,
  175.     $0101, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $012F,
  176.     $010D, $00E9, $0119, $00EB, $0117, $00ED, $00EE, $012B,
  177.     $0111, $0146, $014D, $0137, $00F4, $00F5, $00F6, $00F7,
  178.     $00F8, $0173, $00FA, $00FB, $00FC, $0169, $016B, $02D9
  179.     );
  180.  
  181. {CYRILLIC
  182.   Bulgarian, Bielorussian, English, Macedonian, Russian,
  183.   Serbo-Croatian and Ukrainian.
  184. }
  185.   CharISO_8859_5: array[128..255] of Word =
  186.   (
  187.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  188.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  189.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  190.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  191.     $00A0, $0401, $0402, $0403, $0404, $0405, $0406, $0407,
  192.     $0408, $0409, $040A, $040B, $040C, $00AD, $040E, $040F,
  193.     $0410, $0411, $0412, $0413, $0414, $0415, $0416, $0417,
  194.     $0418, $0419, $041A, $041B, $041C, $041D, $041E, $041F,
  195.     $0420, $0421, $0422, $0423, $0424, $0425, $0426, $0427,
  196.     $0428, $0429, $042A, $042B, $042C, $042D, $042E, $042F,
  197.     $0430, $0431, $0432, $0433, $0434, $0435, $0436, $0437,
  198.     $0438, $0439, $043A, $043B, $043C, $043D, $043E, $043F,
  199.     $0440, $0441, $0442, $0443, $0444, $0445, $0446, $0447,
  200.     $0448, $0449, $044A, $044B, $044C, $044D, $044E, $044F,
  201.     $2116, $0451, $0452, $0453, $0454, $0455, $0456, $0457,
  202.     $0458, $0459, $045A, $045B, $045C, $00A7, $045E, $045F
  203.     );
  204.  
  205. {ARABIC
  206. }
  207.   CharISO_8859_6: array[128..255] of Word =
  208.   (
  209.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  210.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  211.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  212.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  213.     $00A0, $FFFD, $FFFD, $FFFD, $00A4, $FFFD, $FFFD, $FFFD,
  214.     $FFFD, $FFFD, $FFFD, $FFFD, $060C, $00AD, $FFFD, $FFFD,
  215.     $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  216.     $FFFD, $FFFD, $FFFD, $061B, $FFFD, $FFFD, $FFFD, $061F,
  217.     $FFFD, $0621, $0622, $0623, $0624, $0625, $0626, $0627,
  218.     $0628, $0629, $062A, $062B, $062C, $062D, $062E, $062F,
  219.     $0630, $0631, $0632, $0633, $0634, $0635, $0636, $0637,
  220.     $0638, $0639, $063A, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  221.     $0640, $0641, $0642, $0643, $0644, $0645, $0646, $0647,
  222.     $0648, $0649, $064A, $064B, $064C, $064D, $064E, $064F,
  223.     $0650, $0651, $0652, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  224.     $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD
  225.     );
  226.  
  227. {GREEK
  228. }
  229.   CharISO_8859_7: array[128..255] of Word =
  230.   (
  231.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  232.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  233.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  234.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  235.     $00A0, $2018, $2019, $00A3, $FFFD, $FFFD, $00A6, $00A7,
  236.     $00A8, $00A9, $FFFD, $00AB, $00AC, $00AD, $FFFD, $2015,
  237.     $00B0, $00B1, $00B2, $00B3, $0384, $0385, $0386, $00B7,
  238.     $0388, $0389, $038A, $00BB, $038C, $00BD, $038E, $038F,
  239.     $0390, $0391, $0392, $0393, $0394, $0395, $0396, $0397,
  240.     $0398, $0399, $039A, $039B, $039C, $039D, $039E, $039F,
  241.     $03A0, $03A1, $FFFD, $03A3, $03A4, $03A5, $03A6, $03A7,
  242.     $03A8, $03A9, $03AA, $03AB, $03AC, $03AD, $03AE, $03AF,
  243.     $03B0, $03B1, $03B2, $03B3, $03B4, $03B5, $03B6, $03B7,
  244.     $03B8, $03B9, $03BA, $03BB, $03BC, $03BD, $03BE, $03BF,
  245.     $03C0, $03C1, $03C2, $03C3, $03C4, $03C5, $03C6, $03C7,
  246.     $03C8, $03C9, $03CA, $03CB, $03CC, $03CD, $03CE, $FFFD
  247.     );
  248.  
  249. {HEBREW
  250. }
  251.   CharISO_8859_8: array[128..255] of Word =
  252.   (
  253.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  254.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  255.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  256.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  257.     $00A0, $FFFD, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  258.     $00A8, $00A9, $00D7, $00AB, $00AC, $00AD, $00AE, $00AF,
  259.     $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  260.     $00B8, $00B9, $00F7, $00BB, $00BC, $00BD, $00BE, $FFFD,
  261.     $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  262.     $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  263.     $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  264.     $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $2017,
  265.     $05D0, $05D1, $05D2, $05D3, $05D4, $05D5, $05D6, $05D7,
  266.     $05D8, $05D9, $05DA, $05DB, $05DC, $05DD, $05DE, $05DF,
  267.     $05E0, $05E1, $05E2, $05E3, $05E4, $05E5, $05E6, $05E7,
  268.     $05E8, $05E9, $05EA, $FFFD, $FFFD, $200E, $200F, $FFFD
  269.     );
  270.  
  271. {Latin-5
  272.   English, Finnish, French, German, Irish, Italian, Norwegian,
  273.   Portuguese, Spanish, Swedish and Turkish.
  274. }
  275.   CharISO_8859_9: array[128..255] of Word =
  276.   (
  277.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  278.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  279.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  280.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  281.     $00A0, $0104, $02D8, $0141, $00A4, $013D, $015A, $00A7,
  282.     $00A8, $0160, $015E, $0164, $0179, $00AD, $017D, $017B,
  283.     $00B0, $0105, $02DB, $0142, $00B4, $013E, $015B, $02C7,
  284.     $00B8, $0161, $015F, $0165, $017A, $02DD, $017E, $017C,
  285.     $0154, $00C1, $00C2, $0102, $00C4, $0139, $0106, $00C7,
  286.     $010C, $00C9, $0118, $00CB, $011A, $00CD, $00CE, $010E,
  287.     $011E, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  288.     $00D8, $00D9, $00DA, $00DB, $00DC, $0130, $015E, $00DF,
  289.     $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  290.     $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  291.     $011F, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  292.     $00F8, $00F9, $00FA, $00FB, $00FC, $0131, $015F, $00FF
  293.     );
  294.  
  295. {Latin-6
  296.   Danish, English, Estonian, Faeroese, Finnish, German, Greenlandic,
  297.   Icelandic, Lappish, Latvian, Lithuanian, Norwegian and Swedish.
  298. }
  299.   CharISO_8859_10: array[128..255] of Word =
  300.   (
  301.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  302.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  303.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  304.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  305.     $00A0, $0104, $0112, $0122, $012A, $0128, $0136, $00A7,
  306.     $013B, $0110, $0160, $0166, $017D, $00AD, $016A, $014A,
  307.     $00B0, $0105, $0113, $0123, $012B, $0129, $0137, $00B7,
  308.     $013C, $0111, $0161, $0167, $017E, $2015, $016B, $014B,
  309.     $0100, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $012E,
  310.     $010C, $00C9, $0118, $00CB, $0116, $00CD, $00CE, $00CF,
  311.     $00D0, $0145, $014C, $00D3, $00D4, $00D5, $00D6, $0168,
  312.     $00D8, $0172, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  313.     $0101, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $012F,
  314.     $010D, $00E9, $0119, $00EB, $0117, $00ED, $00EE, $00EF,
  315.     $00F0, $0146, $014D, $00F3, $00F4, $00F5, $00F6, $0169,
  316.     $00F8, $0173, $00FA, $00FB, $00FC, $00FD, $00FE, $0138
  317.     );
  318.  
  319.   CharISO_8859_13: array[128..255] of Word =
  320.   (
  321.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  322.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  323.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  324.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  325.     $00A0, $201D, $00A2, $00A3, $00A4, $201E, $00A6, $00A7,
  326.     $00D8, $00A9, $0156, $00AB, $00AC, $00AD, $00AE, $00C6,
  327.     $00B0, $00B1, $00B2, $00B3, $201C, $00B5, $00B6, $00B7,
  328.     $00F8, $00B9, $0157, $00BB, $00BC, $00BD, $00BE, $00E6,
  329.     $0104, $012E, $0100, $0106, $00C4, $00C5, $0118, $0112,
  330.     $010C, $00C9, $0179, $0116, $0122, $0136, $012A, $013B,
  331.     $0160, $0143, $0145, $00D3, $014C, $00D5, $00D6, $00D7,
  332.     $0172, $0141, $015A, $016A, $00DC, $017B, $017D, $00DF,
  333.     $0105, $012F, $0101, $0107, $00E4, $00E5, $0119, $0113,
  334.     $010D, $00E9, $017A, $0117, $0123, $0137, $012B, $013C,
  335.     $0161, $0144, $0146, $00F3, $014D, $00F5, $00F6, $00F7,
  336.     $0173, $0142, $015B, $016B, $00FC, $017C, $017E, $2019
  337.     );
  338.  
  339.   CharISO_8859_14: array[128..255] of Word =
  340.   (
  341.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  342.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  343.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  344.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  345.     $00A0, $1E02, $1E03, $00A3, $010A, $010B, $1E0A, $00A7,
  346.     $1E80, $00A9, $1E82, $1E0B, $1EF2, $00AD, $00AE, $0178,
  347.     $1E1E, $1E1F, $0120, $0121, $1E40, $1E41, $00B6, $1E56,
  348.     $1E81, $1E57, $1E83, $1E60, $1EF3, $1E84, $1E85, $1E61,
  349.     $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  350.     $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  351.     $0174, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $1E6A,
  352.     $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $0176, $00DF,
  353.     $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  354.     $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  355.     $0175, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $1E6B,
  356.     $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $0177, $00FF
  357.     );
  358.  
  359.   CharISO_8859_15: array[128..255] of Word =
  360.   (
  361.     $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  362.     $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  363.     $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  364.     $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  365.     $00A0, $00A1, $00A2, $00A3, $20AC, $00A5, $0160, $00A7,
  366.     $0161, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  367.     $00B0, $00B1, $00B2, $00B3, $017D, $00B5, $00B6, $00B7,
  368.     $017E, $00B9, $00BA, $00BB, $0152, $0153, $0178, $00BF,
  369.     $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  370.     $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  371.     $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  372.     $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  373.     $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  374.     $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  375.     $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  376.     $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF
  377.     );
  378.  
  379. {Eastern European
  380. }
  381.   CharCP_1250: array[128..255] of Word =
  382.   (
  383.     $20AC, $FFFD, $201A, $FFFD, $201E, $2026, $2020, $2021,
  384.     $FFFD, $2030, $0160, $2039, $015A, $0164, $017D, $0179,
  385.     $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  386.     $FFFD, $2122, $0161, $203A, $015B, $0165, $017E, $017A,
  387.     $00A0, $02C7, $02D8, $0141, $00A4, $0104, $00A6, $00A7,
  388.     $00A8, $00A9, $015E, $00AB, $00AC, $00AD, $00AE, $017B,
  389.     $00B0, $00B1, $02DB, $0142, $00B4, $00B5, $00B6, $00B7,
  390.     $00B8, $0105, $015F, $00BB, $013D, $02DD, $013E, $017C,
  391.     $0154, $00C1, $00C2, $0102, $00C4, $0139, $0106, $00C7,
  392.     $010C, $00C9, $0118, $00CB, $011A, $00CD, $00CE, $010E,
  393.     $0110, $0143, $0147, $00D3, $00D4, $0150, $00D6, $00D7,
  394.     $0158, $016E, $00DA, $0170, $00DC, $00DD, $0162, $00DF,
  395.     $0155, $00E1, $00E2, $0103, $00E4, $013A, $0107, $00E7,
  396.     $010D, $00E9, $0119, $00EB, $011B, $00ED, $00EE, $010F,
  397.     $0111, $0144, $0148, $00F3, $00F4, $0151, $00F6, $00F7,
  398.     $0159, $016F, $00FA, $0171, $00FC, $00FD, $0163, $02D9
  399.     );
  400.  
  401. {Cyrillic
  402. }
  403.   CharCP_1251: array[128..255] of Word =
  404.   (
  405.     $0402, $0403, $201A, $0453, $201E, $2026, $2020, $2021,
  406.     $20AC, $2030, $0409, $2039, $040A, $040C, $040B, $040F,
  407.     $0452, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  408.     $FFFD, $2122, $0459, $203A, $045A, $045C, $045B, $045F,
  409.     $00A0, $040E, $045E, $0408, $00A4, $0490, $00A6, $00A7,
  410.     $0401, $00A9, $0404, $00AB, $00AC, $00AD, $00AE, $0407,
  411.     $00B0, $00B1, $0406, $0456, $0491, $00B5, $00B6, $00B7,
  412.     $0451, $2116, $0454, $00BB, $0458, $0405, $0455, $0457,
  413.     $0410, $0411, $0412, $0413, $0414, $0415, $0416, $0417,
  414.     $0418, $0419, $041A, $041B, $041C, $041D, $041E, $041F,
  415.     $0420, $0421, $0422, $0423, $0424, $0425, $0426, $0427,
  416.     $0428, $0429, $042A, $042B, $042C, $042D, $042E, $042F,
  417.     $0430, $0431, $0432, $0433, $0434, $0435, $0436, $0437,
  418.     $0438, $0439, $043A, $043B, $043C, $043D, $043E, $043F,
  419.     $0440, $0441, $0442, $0443, $0444, $0445, $0446, $0447,
  420.     $0448, $0449, $044A, $044B, $044C, $044D, $044E, $044F
  421.     );
  422.  
  423. {Latin-1 (US, Western Europe)
  424. }
  425.   CharCP_1252: array[128..255] of Word =
  426.   (
  427.     $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  428.     $02C6, $2030, $0160, $2039, $0152, $FFFD, $017D, $FFFD,
  429.     $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  430.     $02DC, $2122, $0161, $203A, $0153, $FFFD, $017E, $0178,
  431.     $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  432.     $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  433.     $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  434.     $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  435.     $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  436.     $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  437.     $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  438.     $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  439.     $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  440.     $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  441.     $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  442.     $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF
  443.     );
  444.  
  445. {Greek
  446. }
  447.   CharCP_1253: array[128..255] of Word =
  448.   (
  449.     $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  450.     $FFFD, $2030, $FFFD, $2039, $FFFD, $FFFD, $FFFD, $FFFD,
  451.     $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  452.     $FFFD, $2122, $FFFD, $203A, $FFFD, $FFFD, $FFFD, $FFFD,
  453.     $00A0, $0385, $0386, $00A3, $00A4, $00A5, $00A6, $00A7,
  454.     $00A8, $00A9, $FFFD, $00AB, $00AC, $00AD, $00AE, $2015,
  455.     $00B0, $00B1, $00B2, $00B3, $0384, $00B5, $00B6, $00B7,
  456.     $0388, $0389, $038A, $00BB, $038C, $00BD, $038E, $038F,
  457.     $0390, $0391, $0392, $0393, $0394, $0395, $0396, $0397,
  458.     $0398, $0399, $039A, $039B, $039C, $039D, $039E, $039F,
  459.     $03A0, $03A1, $FFFD, $03A3, $03A4, $03A5, $03A6, $03A7,
  460.     $03A8, $03A9, $03AA, $03AB, $03AC, $03AD, $03AE, $03AF,
  461.     $03B0, $03B1, $03B2, $03B3, $03B4, $03B5, $03B6, $03B7,
  462.     $03B8, $03B9, $03BA, $03BB, $03BC, $03BD, $03BE, $03BF,
  463.     $03C0, $03C1, $03C2, $03C3, $03C4, $03C5, $03C6, $03C7,
  464.     $03C8, $03C9, $03CA, $03CB, $03CC, $03CD, $03CE, $FFFD
  465.     );
  466.  
  467. {Turkish
  468. }
  469.   CharCP_1254: array[128..255] of Word =
  470.   (
  471.     $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  472.     $02C6, $2030, $0160, $2039, $0152, $FFFD, $FFFD, $FFFD,
  473.     $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  474.     $02DC, $2122, $0161, $203A, $0153, $FFFD, $FFFD, $0178,
  475.     $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  476.     $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  477.     $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  478.     $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  479.     $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  480.     $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  481.     $011E, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  482.     $00D8, $00D9, $00DA, $00DB, $00DC, $0130, $015E, $00DF,
  483.     $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  484.     $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  485.     $011F, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  486.     $00F8, $00F9, $00FA, $00FB, $00FC, $0131, $015F, $00FF
  487.     );
  488.  
  489. {Hebrew
  490. }
  491.   CharCP_1255: array[128..255] of Word =
  492.   (
  493.     $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  494.     $02C6, $2030, $FFFD, $2039, $FFFD, $FFFD, $FFFD, $FFFD,
  495.     $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  496.     $02DC, $2122, $FFFD, $203A, $FFFD, $FFFD, $FFFD, $FFFD,
  497.     $00A0, $00A1, $00A2, $00A3, $20AA, $00A5, $00A6, $00A7,
  498.     $00A8, $00A9, $00D7, $00AB, $00AC, $00AD, $00AE, $00AF,
  499.     $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  500.     $00B8, $00B9, $00F7, $00BB, $00BC, $00BD, $00BE, $00BF,
  501.     $05B0, $05B1, $05B2, $05B3, $05B4, $05B5, $05B6, $05B7,
  502.     $05B8, $05B9, $FFFD, $05BB, $05BC, $05BD, $05BE, $05BF,
  503.     $05C0, $05C1, $05C2, $05C3, $05F0, $05F1, $05F2, $05F3,
  504.     $05F4, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  505.     $05D0, $05D1, $05D2, $05D3, $05D4, $05D5, $05D6, $05D7,
  506.     $05D8, $05D9, $05DA, $05DB, $05DC, $05DD, $05DE, $05DF,
  507.     $05E0, $05E1, $05E2, $05E3, $05E4, $05E5, $05E6, $05E7,
  508.     $05E8, $05E9, $05EA, $FFFD, $FFFD, $200E, $200F, $FFFD
  509.     );
  510.  
  511. {Arabic
  512. }
  513.   CharCP_1256: array[128..255] of Word =
  514.   (
  515.     $20AC, $067E, $201A, $0192, $201E, $2026, $2020, $2021,
  516.     $02C6, $2030, $0679, $2039, $0152, $0686, $0698, $0688,
  517.     $06AF, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  518.     $06A9, $2122, $0691, $203A, $0153, $200C, $200D, $06BA,
  519.     $00A0, $060C, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  520.     $00A8, $00A9, $06BE, $00AB, $00AC, $00AD, $00AE, $00AF,
  521.     $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  522.     $00B8, $00B9, $061B, $00BB, $00BC, $00BD, $00BE, $061F,
  523.     $06C1, $0621, $0622, $0623, $0624, $0625, $0626, $0627,
  524.     $0628, $0629, $062A, $062B, $062C, $062D, $062E, $062F,
  525.     $0630, $0631, $0632, $0633, $0634, $0635, $0636, $00D7,
  526.     $0637, $0638, $0639, $063A, $0640, $0641, $0642, $0643,
  527.     $00E0, $0644, $00E2, $0645, $0646, $0647, $0648, $00E7,
  528.     $00E8, $00E9, $00EA, $00EB, $0649, $064A, $00EE, $00EF,
  529.     $064B, $064C, $064D, $064E, $00F4, $064F, $0650, $00F7,
  530.     $0651, $00F9, $0652, $00FB, $00FC, $200E, $200F, $06D2
  531.     );
  532.  
  533. {Baltic
  534. }
  535.   CharCP_1257: array[128..255] of Word =
  536.   (
  537.     $20AC, $FFFD, $201A, $FFFD, $201E, $2026, $2020, $2021,
  538.     $FFFD, $2030, $FFFD, $2039, $FFFD, $00A8, $02C7, $00B8,
  539.     $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  540.     $FFFD, $2122, $FFFD, $203A, $FFFD, $00AF, $02DB, $FFFD,
  541.     $00A0, $FFFD, $00A2, $00A3, $00A4, $FFFD, $00A6, $00A7,
  542.     $00D8, $00A9, $0156, $00AB, $00AC, $00AD, $00AE, $00C6,
  543.     $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  544.     $00F8, $00B9, $0157, $00BB, $00BC, $00BD, $00BE, $00E6,
  545.     $0104, $012E, $0100, $0106, $00C4, $00C5, $0118, $0112,
  546.     $010C, $00C9, $0179, $0116, $0122, $0136, $012A, $013B,
  547.     $0160, $0143, $0145, $00D3, $014C, $00D5, $00D6, $00D7,
  548.     $0172, $0141, $015A, $016A, $00DC, $017B, $017D, $00DF,
  549.     $0105, $012F, $0101, $0107, $00E4, $00E5, $0119, $0113,
  550.     $010D, $00E9, $017A, $0117, $0123, $0137, $012B, $013C,
  551.     $0161, $0144, $0146, $00F3, $014D, $00F5, $00F6, $00F7,
  552.     $0173, $0142, $015B, $016B, $00FC, $017C, $017E, $02D9
  553.     );
  554.  
  555. {??
  556. }
  557.   CharCP_1258: array[128..255] of Word =
  558.   (
  559.     $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  560.     $02C6, $2030, $FFFD, $2039, $0152, $FFFD, $FFFD, $FFFD,
  561.     $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  562.     $02DC, $2122, $FFFD, $203A, $0153, $FFFD, $FFFD, $0178,
  563.     $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  564.     $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  565.     $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  566.     $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  567.     $00C0, $00C1, $00C2, $0102, $00C4, $00C5, $00C6, $00C7,
  568.     $00C8, $00C9, $00CA, $00CB, $0300, $00CD, $00CE, $00CF,
  569.     $0110, $00D1, $0309, $00D3, $00D4, $01A0, $00D6, $00D7,
  570.     $00D8, $00D9, $00DA, $00DB, $00DC, $01AF, $0303, $00DF,
  571.     $00E0, $00E1, $00E2, $0103, $00E4, $00E5, $00E6, $00E7,
  572.     $00E8, $00E9, $00EA, $00EB, $0301, $00ED, $00EE, $00EF,
  573.     $0111, $00F1, $0323, $00F3, $00F4, $01A1, $00F6, $00F7,
  574.     $00F8, $00F9, $00FA, $00FB, $00FC, $01B0, $20AB, $00FF
  575.     );
  576.  
  577. {Cyrillic
  578. }
  579.   CharKOI8_R: array[128..255] of Word =
  580.   (
  581.     $2500, $2502, $250C, $2510, $2514, $2518, $251C, $2524,
  582.     $252C, $2534, $253C, $2580, $2584, $2588, $258C, $2590,
  583.     $2591, $2592, $2593, $2320, $25A0, $2219, $221A, $2248,
  584.     $2264, $2265, $00A0, $2321, $00B0, $00B2, $00B7, $00F7,
  585.     $2550, $2551, $2552, $0451, $2553, $2554, $2555, $2556,
  586.     $2557, $2558, $2559, $255A, $255B, $255C, $255D, $255E,
  587.     $255F, $2560, $2561, $0401, $2562, $2563, $2564, $2565,
  588.     $2566, $2567, $2568, $2569, $256A, $256B, $256C, $00A9,
  589.     $044E, $0430, $0431, $0446, $0434, $0435, $0444, $0433,
  590.     $0445, $0438, $0439, $043A, $043B, $043C, $043D, $043E,
  591.     $043F, $044F, $0440, $0441, $0442, $0443, $0436, $0432,
  592.     $044C, $044B, $0437, $0448, $044D, $0449, $0447, $044A,
  593.     $042E, $0410, $0411, $0426, $0414, $0415, $0424, $0413,
  594.     $0425, $0418, $0419, $041A, $041B, $041C, $041D, $041E,
  595.     $041F, $042F, $0420, $0421, $0422, $0423, $0416, $0412,
  596.     $042C, $042B, $0417, $0428, $042D, $0429, $0427, $042A
  597.     );
  598.  
  599. {Czech (Kamenicky)
  600. }
  601.   CharCP_895: array[128..255] of Word =
  602.   (
  603.     $010C, $00FC, $00E9, $010F, $00E4, $010E, $0164, $010D,
  604.     $011B, $011A, $0139, $00CD, $013E, $013A, $00C4, $00C1,
  605.     $00C9, $017E, $017D, $00F4, $00F6, $00D3, $016F, $00DA,
  606.     $00FD, $00D6, $00DC, $0160, $013D, $00DD, $0158, $0165,
  607.     $00E1, $00ED, $00F3, $00FA, $0148, $0147, $016E, $00D4,
  608.     $0161, $0159, $0155, $0154, $00BC, $00A7, $00AB, $00BB,
  609.     $2591, $2592, $2593, $2502, $2524, $2561, $2562, $2556,
  610.     $2555, $2563, $2551, $2557, $255D, $255C, $255B, $2510,
  611.     $2514, $2534, $252C, $251C, $2500, $253C, $255E, $255F,
  612.     $255A, $2554, $2569, $2566, $2560, $2550, $256C, $2567,
  613.     $2568, $2564, $2565, $2559, $2558, $2552, $2553, $256B,
  614.     $256A, $2518, $250C, $2588, $2584, $258C, $2590, $2580,
  615.     $03B1, $03B2, $0393, $03C0, $03A3, $03C3, $03BC, $03C4,
  616.     $03A6, $0398, $03A9, $03B4, $221E, $2205, $03B5, $2229,
  617.     $2261, $00B1, $2265, $2264, $2320, $2321, $00F7, $2248,
  618.     $2218, $00B7, $2219, $221A, $207F, $00B2, $25A0, $00A0
  619.     );
  620.  
  621. {Eastern European
  622. }
  623.   CharCP_852: array[128..255] of Word =
  624.   (
  625.     $00C7, $00FC, $00E9, $00E2, $00E4, $016F, $0107, $00E7,
  626.     $0142, $00EB, $0150, $0151, $00EE, $0179, $00C4, $0106,
  627.     $00C9, $0139, $013A, $00F4, $00F6, $013D, $013E, $015A,
  628.     $015B, $00D6, $00DC, $0164, $0165, $0141, $00D7, $010D,
  629.     $00E1, $00ED, $00F3, $00FA, $0104, $0105, $017D, $017E,
  630.     $0118, $0119, $00AC, $017A, $010C, $015F, $00AB, $00BB,
  631.     $2591, $2592, $2593, $2502, $2524, $00C1, $00C2, $011A,
  632.     $015E, $2563, $2551, $2557, $255D, $017B, $017C, $2510,
  633.     $2514, $2534, $252C, $251C, $2500, $253C, $0102, $0103,
  634.     $255A, $2554, $2569, $2566, $2560, $2550, $256C, $00A4,
  635.     $0111, $0110, $010E, $00CB, $010F, $0147, $00CD, $00CE,
  636.     $011B, $2518, $250C, $2588, $2584, $0162, $016E, $2580,
  637.     $00D3, $00DF, $00D4, $0143, $0144, $0148, $0160, $0161,
  638.     $0154, $00DA, $0155, $0170, $00FD, $00DD, $0163, $00B4,
  639.     $00AD, $02DD, $02DB, $02C7, $02D8, $00A7, $00F7, $00B8,
  640.     $00B0, $00A8, $02D9, $0171, $0158, $0159, $25A0, $00A0
  641.     );
  642.  
  643.   // nothing fr replace
  644.   Replace_None: array[0..0] of Word =
  645.     (0);
  646.  
  647.   //remove diakritics from Czech
  648.   Replace_Czech: array[0..55] of Word =
  649.     (
  650.       $00E1, $0061,
  651.       $010D, $0063,
  652.       $010F, $0064,
  653.       $010E, $0044,
  654.       $00E9, $0065,
  655.       $011B, $0065,
  656.       $00ED, $0069,
  657.       $00F3, $006F,
  658.       $0159, $0072,
  659.       $0161, $0073,
  660.       $0165, $0074,
  661.       $00FA, $0075,
  662.       $016F, $0075,
  663.       $00FD, $0079,
  664.       $017E, $007A,
  665.       $00C1, $0041,
  666.       $010C, $0043,
  667.       $00C9, $0045,
  668.       $011A, $0045,
  669.       $00CD, $0049,
  670.       $00D3, $004F,
  671.       $0158, $0052,
  672.       $0160, $0053,
  673.       $0164, $0053,
  674.       $00DA, $0054,
  675.       $016E, $0055,
  676.       $00DD, $0059,
  677.       $017D, $005A
  678.     );
  679.  
  680. {==============================================================================}
  681. function UTF8toUCS4(const Value: string): string;
  682. function UCS4toUTF8(const Value: string): string;
  683. function UTF7toUCS2(const Value: string): string;
  684. function UCS2toUTF7(const Value: string): string;
  685. function CharsetConversion(Value: string; CharFrom: TMimeChar;
  686.   CharTo: TMimeChar): string;
  687. function CharsetConversionEx(Value: string; CharFrom: TMimeChar;
  688.   CharTo: TMimeChar; const TransformTable: array of Word): string;
  689. function GetCurCP: TMimeChar;
  690. function GetCPFromID(Value: string): TMimeChar;
  691. function GetIDFromCP(Value: TMimeChar): string;
  692. function NeedCharsetConversion(const Value: string): Boolean;
  693. function IdealCharsetCoding(const Value: string; CharFrom: TMimeChar;
  694.   CharTo: TMimeSetChar): TMimeChar;
  695.  
  696. implementation
  697.  
  698. uses
  699. {$IFDEF LINUX}
  700.   Libc,
  701. {$ELSE}
  702.   Windows,
  703. {$ENDIF}
  704.   SysUtils,
  705.   SynaUtil, SynaCode;
  706.  
  707. const
  708.   NotFoundChar = '_';
  709.  
  710. var
  711.   SetTwo: set of TMimeChar = [UCS_2, UTF_7];
  712.   SetFour: set of TMimeChar = [UCS_4, UTF_8];
  713.  
  714. {==============================================================================}
  715. function ReplaceUnicode(Value: Word; const TransformTable: array of Word): Word;
  716. var
  717.   n: integer;
  718. begin
  719.   if High(TransformTable) <> 0 then
  720.     for n := 0 to High(TransformTable) do
  721.       if not odd(n) then
  722.         if TransformTable[n] = Value then
  723.           begin
  724.             Value := TransformTable[n+1];
  725.             break;
  726.           end;
  727.   Result := Value;
  728. end;
  729.  
  730. {==============================================================================}
  731. procedure CopyArray(const SourceTable: array of Word;
  732.   var TargetTable: array of Word);
  733. var
  734.   n: Integer;
  735. begin
  736.   for n := 0 to 127 do
  737.     TargetTable[n] := SourceTable[n];
  738. end;
  739.  
  740. {==============================================================================}
  741. procedure GetArray(CharSet: TMimeChar; var Result: array of Word);
  742. begin
  743.   case CharSet of
  744.     ISO_8859_1:
  745.       CopyArray(CharISO_8859_1, Result);
  746.     ISO_8859_2:
  747.       CopyArray(CharISO_8859_2, Result);
  748.     ISO_8859_3:
  749.       CopyArray(CharISO_8859_3, Result);
  750.     ISO_8859_4:
  751.       CopyArray(CharISO_8859_4, Result);
  752.     ISO_8859_5:
  753.       CopyArray(CharISO_8859_5, Result);
  754.     ISO_8859_6:
  755.       CopyArray(CharISO_8859_6, Result);
  756.     ISO_8859_7:
  757.       CopyArray(CharISO_8859_7, Result);
  758.     ISO_8859_8:
  759.       CopyArray(CharISO_8859_8, Result);
  760.     ISO_8859_9:
  761.       CopyArray(CharISO_8859_9, Result);
  762.     ISO_8859_10:
  763.       CopyArray(CharISO_8859_10, Result);
  764.     ISO_8859_13:
  765.       CopyArray(CharISO_8859_13, Result);
  766.     ISO_8859_14:
  767.       CopyArray(CharISO_8859_14, Result);
  768.     ISO_8859_15:
  769.       CopyArray(CharISO_8859_15, Result);
  770.     CP1250:
  771.       CopyArray(CharCP_1250, Result);
  772.     CP1251:
  773.       CopyArray(CharCP_1251, Result);
  774.     CP1252:
  775.       CopyArray(CharCP_1252, Result);
  776.     CP1253:
  777.       CopyArray(CharCP_1253, Result);
  778.     CP1254:
  779.       CopyArray(CharCP_1254, Result);
  780.     CP1255:
  781.       CopyArray(CharCP_1255, Result);
  782.     CP1256:
  783.       CopyArray(CharCP_1256, Result);
  784.     CP1257:
  785.       CopyArray(CharCP_1257, Result);
  786.     CP1258:
  787.       CopyArray(CharCP_1258, Result);
  788.     KOI8_R:
  789.       CopyArray(CharKOI8_R, Result);
  790.     CP895:
  791.       CopyArray(CharCP_895, Result);
  792.     CP852:
  793.       CopyArray(CharCP_852, Result);
  794.   end;
  795. end;
  796.  
  797. {==============================================================================}
  798. procedure ReadMulti(const Value: string; var Index: Integer; mb: Byte;
  799.   var b1, b2, b3, b4: Byte);
  800. var
  801.   b: array[0..3] of Byte;
  802.   n: Integer;
  803.   s: string;
  804. begin
  805.   b[0] := 0;
  806.   b[1] := 0;
  807.   b[2] := 0;
  808.   b[3] := 0;
  809.   if (Length(Value) + 1) < Index + mb then
  810.     Exit;
  811.   s := '';
  812.   for n := 1 to mb do
  813.   begin
  814.     s := Value[Index] + s;
  815.     Inc(Index);
  816.   end;
  817.   for n := 1 to mb do
  818.     b[n - 1] := Ord(s[n]);
  819.   b1 := b[0];
  820.   b2 := b[1];
  821.   b3 := b[2];
  822.   b4 := b[3];
  823. end;
  824.  
  825. {==============================================================================}
  826. function WriteMulti(b1, b2, b3, b4: Byte; mb: Byte): string;
  827. var
  828.   b: array[0..3] of Byte;
  829.   n: Integer;
  830. begin
  831.   Result := '';
  832.   b[0] := b1;
  833.   b[1] := b2;
  834.   b[2] := b3;
  835.   b[3] := b4;
  836.   for n := 1 to mb do
  837.     Result := Char(b[n - 1]) + Result;
  838. end;
  839.  
  840. {==============================================================================}
  841. function UTF8toUCS4(const Value: string): string;
  842. var
  843.   n, x, ul, m: Integer;
  844.   s: string;
  845.   w1, w2: Word;
  846. begin
  847.   Result := '';
  848.   n := 1;
  849.   while Length(Value) >= n do
  850.   begin
  851.     x := Ord(Value[n]);
  852.     Inc(n);
  853.     if x < 128 then
  854.       Result := Result + WriteMulti(x, 0, 0, 0, 4)
  855.     else
  856.     begin
  857.       m := 0;
  858.       if (x and $E0) = $C0 then
  859.         m := $1F;
  860.       if (x and $F0) = $E0 then
  861.         m := $0F;
  862.       if (x and $F8) = $F0 then
  863.         m := $07;
  864.       if (x and $FC) = $F8 then
  865.         m := $03;
  866.       if (x and $FE) = $FC then
  867.         m := $01;
  868.       ul := x and m;
  869.       s := IntToBin(ul, 0);
  870.       while Length(Value) >= n do
  871.       begin
  872.         x := Ord(Value[n]);
  873.         Inc(n);
  874.         if (x and $C0) = $80 then
  875.           s := s + IntToBin(x and $3F, 6)
  876.         else
  877.         begin
  878.           Dec(n);
  879.           Break;
  880.         end;
  881.       end;
  882.       ul := BinToInt(s);
  883.       w1 := ul div 65536;
  884.       w2 := ul mod 65536;
  885.       Result := Result + WriteMulti(Lo(w2), Hi(w2), Lo(w1), Hi(w1), 4);
  886.     end;
  887.   end;
  888. end;
  889.  
  890. {==============================================================================}
  891. function UCS4toUTF8(const Value: string): string;
  892. var
  893.   s, l, k: string;
  894.   b1, b2, b3, b4: Byte;
  895.   n, m, x, y: Integer;
  896.   b: Byte;
  897. begin
  898.   Result := '';
  899.   n := 1;
  900.   while Length(Value) >= n do
  901.   begin
  902.     ReadMulti(Value, n, 4, b1, b2, b3, b4);
  903.     if (b2 = 0) and (b3 = 0) and (b4 = 0) and (b1 < 128) then
  904.       Result := Result + Char(b1)
  905.     else
  906.     begin
  907.       x := (b1 + 256 * b2) + (b3 + 256 * b4) * 65536;
  908.       l := IntToBin(x, 0);
  909.       y := Length(l) div 6;
  910.       s := '';
  911.       for m := 1 to y do
  912.       begin
  913.         k := Copy(l, Length(l) - 5, 6);
  914.         l := Copy(l, 1, Length(l) - 6);
  915.         b := BinToInt(k) or $80;
  916.         s := Char(b) + s;
  917.       end;
  918.       b := BinToInt(l);
  919.       case y of
  920.         5:
  921.           b := b or $FC;
  922.         4:
  923.           b := b or $F8;
  924.         3:
  925.           b := b or $F0;
  926.         2:
  927.           b := b or $E0;
  928.         1:
  929.           b := b or $C0;
  930.       end;
  931.       s := Char(b) + s;
  932.       Result := Result + s;
  933.     end;
  934.   end;
  935. end;
  936.  
  937. {==============================================================================}
  938. function UTF7toUCS2(const Value: string): string;
  939. var
  940.   n: Integer;
  941.   c: Char;
  942.   s: string;
  943. begin
  944.   Result := '';
  945.   n := 1;
  946.   while Length(Value) >= n do
  947.   begin
  948.     c := Value[n];
  949.     Inc(n);
  950.     if c <> '+' then
  951.       Result := Result + WriteMulti(Ord(c), 0, 0, 0, 2)
  952.     else
  953.     begin
  954.       s := '';
  955.       while Length(Value) >= n do
  956.       begin
  957.         c := Value[n];
  958.         Inc(n);
  959.         if c = '-' then
  960.           Break;
  961.         if (c = '=') or (Pos(c, TableBase64) < 1) then
  962.         begin
  963.           Dec(n);
  964.           Break;
  965.         end;
  966.         s := s + c;
  967.       end;
  968.       if s = '' then
  969.         s := WriteMulti(Ord('+'), 0, 0, 0, 2)
  970.       else
  971.         s := DecodeBase64(s);
  972.       Result := Result + s;
  973.     end;
  974.   end;
  975. end;
  976.  
  977. {==============================================================================}
  978. function UCS2toUTF7(const Value: string): string;
  979. var
  980.   s: string;
  981.   b1, b2, b3, b4: Byte;
  982.   n, m: Integer;
  983. begin
  984.   Result := '';
  985.   n := 1;
  986.   while Length(Value) >= n do
  987.   begin
  988.     ReadMulti(Value, n, 2, b1, b2, b3, b4);
  989.     if (b2 = 0) and (b1 < 128) then
  990.       if Char(b1) = '+' then
  991.         Result := Result + '+-'
  992.       else
  993.         Result := Result + Char(b1)
  994.     else
  995.     begin
  996.       s := Char(b2) + Char(b1);
  997.       while Length(Value) >= n do
  998.       begin
  999.         ReadMulti(Value, n, 2, b1, b2, b3, b4);
  1000.         if (b2 = 0) and (b1 < 128) then
  1001.         begin
  1002.           Dec(n, 2);
  1003.           Break;
  1004.         end;
  1005.         s := s + Char(b2) + Char(b1);
  1006.       end;
  1007.       s := EncodeBase64(s);
  1008.       m := Pos('=', s);
  1009.       if m > 0 then
  1010.         s := Copy(s, 1, m - 1);
  1011.       Result := Result + '+' + s + '-';
  1012.     end;
  1013.   end;
  1014. end;
  1015.  
  1016. {==============================================================================}
  1017. function CharsetConversion(Value: string; CharFrom: TMimeChar;
  1018.   CharTo: TMimeChar): string;
  1019. begin
  1020.   Result := CharsetConversionEx(Value, CharFrom, CharTo, Replace_None);
  1021. end;
  1022.  
  1023. {==============================================================================}
  1024. function CharsetConversionEx(Value: string; CharFrom: TMimeChar;
  1025.   CharTo: TMimeChar; const TransformTable: array of Word): string;
  1026. var
  1027.   uni: Word;
  1028.   n, m: Integer;
  1029.   b: Byte;
  1030.   b1, b2, b3, b4: Byte;
  1031.   SourceTable, TargetTable: array[128..255] of Word;
  1032.   mbf, mbt: Byte;
  1033. begin
  1034.   GetArray(CharFrom, SourceTable);
  1035.   GetArray(CharTo, TargetTable);
  1036.   mbf := 1;
  1037.   if CharFrom in SetTwo then
  1038.     mbf := 2;
  1039.   if CharFrom in SetFour then
  1040.     mbf := 4;
  1041.   mbt := 1;
  1042.   if CharTo in SetTwo then
  1043.     mbt := 2;
  1044.   if CharTo in SetFour then
  1045.     mbt := 4;
  1046.  
  1047.   if CharFrom = UTF_8 then
  1048.     Value := UTF8toUCS4(Value);
  1049.   if CharFrom = UTF_7 then
  1050.     Value := UTF7toUCS2(Value);
  1051.   Result := '';
  1052.  
  1053.   n := 1;
  1054.   while Length(Value) >= n do
  1055.   begin
  1056.     ReadMulti(Value, n, mbf, b1, b2, b3, b4);
  1057.     if mbf = 1 then
  1058.       if b1 > 127 then
  1059.       begin
  1060.         uni := SourceTable[b1];
  1061.         uni := ReplaceUnicode(uni, TransformTable);
  1062.         b1 := Lo(uni);
  1063.         b2 := Hi(uni);
  1064.       end;
  1065.     // b1..b4 - Unicode Char
  1066.     uni := b2 * 256 + b1;
  1067.     if (b3 <> 0) or (b4 <> 0) then
  1068.     begin
  1069.       b1 := Ord(NotFoundChar);
  1070.       b2 := 0;
  1071.       b3 := 0;
  1072.       b4 := 0;
  1073.     end
  1074.     else
  1075.       if mbt = 1 then
  1076.         if uni > 127 then
  1077.         begin
  1078.           b := Ord(NotFoundChar);
  1079.           for m := 128 to 255 do
  1080.             if TargetTable[m] = uni then
  1081.             begin
  1082.               b := m;
  1083.               Break;
  1084.             end;
  1085.           b1 := b;
  1086.           b2 := 0;
  1087.         end
  1088.         else
  1089.           b1 := Lo(uni);
  1090.     Result := Result + WriteMulti(b1, b2, b3, b4, mbt)
  1091.   end;
  1092.  
  1093.   if CharTo = UTF_7 then
  1094.     Result := UCS2toUTF7(Result);
  1095.   if CharTo = UTF_8 then
  1096.     Result := UCS4toUTF8(Result);
  1097.  
  1098. end;
  1099.  
  1100. {==============================================================================}
  1101. {$IFDEF LINUX}
  1102.  
  1103. function GetCurCP: TMimeChar;
  1104. begin
  1105.   Result := GetCPFromID(nl_langinfo(_NL_CTYPE_CODESET_NAME));
  1106. end;
  1107.  
  1108. {$ELSE}
  1109.  
  1110. function GetCurCP: TMimeChar;
  1111. begin
  1112.   case GetACP of
  1113.     1250:
  1114.       Result := CP1250;
  1115.     1251:
  1116.       Result := CP1251;
  1117.     1253:
  1118.       Result := CP1253;
  1119.     1254:
  1120.       Result := CP1254;
  1121.     1255:
  1122.       Result := CP1255;
  1123.     1256:
  1124.       Result := CP1256;
  1125.     1257:
  1126.       Result := CP1257;
  1127.     1258:
  1128.       Result := CP1258;
  1129.   else
  1130.     Result := CP1252;
  1131.   end;
  1132. end;
  1133.  
  1134. {$ENDIF}
  1135.  
  1136. {==============================================================================}
  1137. function GetCPFromID(Value: string): TMimeChar;
  1138. begin
  1139.   Value := UpperCase(Value);
  1140.   Result := ISO_8859_1;
  1141.   if Pos('ISO-8859-10', Value) = 1 then
  1142.     Result := ISO_8859_10
  1143.   else
  1144.   if Pos('ISO-8859-13', Value) = 1 then
  1145.     Result := ISO_8859_13
  1146.   else
  1147.   if Pos('ISO-8859-14', Value) = 1 then
  1148.     Result := ISO_8859_14
  1149.   else
  1150.   if Pos('ISO-8859-15', Value) = 1 then
  1151.     Result := ISO_8859_15
  1152.   else
  1153.   if Pos('ISO-8859-2', Value) = 1 then
  1154.     Result := ISO_8859_2
  1155.   else
  1156.   if Pos('ISO-8859-3', Value) = 1 then
  1157.     Result := ISO_8859_3
  1158.   else
  1159.   if Pos('ISO-8859-4', Value) = 1 then
  1160.     Result := ISO_8859_4
  1161.   else
  1162.   if Pos('ISO-8859-5', Value) = 1 then
  1163.     Result := ISO_8859_5
  1164.   else
  1165.   if Pos('ISO-8859-6', Value) = 1 then
  1166.     Result := ISO_8859_6
  1167.   else
  1168.   if Pos('ISO-8859-7', Value) = 1 then
  1169.     Result := ISO_8859_7
  1170.   else
  1171.   if Pos('ISO-8859-8', Value) = 1 then
  1172.     Result := ISO_8859_8
  1173.   else
  1174.   if Pos('ISO-8859-9', Value) = 1 then
  1175.     Result := ISO_8859_9
  1176.   else
  1177.   if (Pos('WINDOWS-1250', Value) = 1) or (Pos('X-CP1250', Value) = 1) then
  1178.     Result := CP1250
  1179.   else
  1180.   if (Pos('WINDOWS-1251', Value) = 1) or (Pos('X-CP1251', Value) = 1) then
  1181.     Result := CP1251
  1182.   else
  1183.   if (Pos('WINDOWS-1252', Value) = 1) or (Pos('X-CP1252', Value) = 1) then
  1184.     Result := CP1252
  1185.   else
  1186.   if (Pos('WINDOWS-1253', Value) = 1) or (Pos('X-CP1253', Value) = 1) then
  1187.     Result := CP1253
  1188.   else
  1189.   if (Pos('WINDOWS-1254', Value) = 1) or (Pos('X-CP1254', Value) = 1) then
  1190.     Result := CP1254
  1191.   else
  1192.   if (Pos('WINDOWS-1255', Value) = 1) or (Pos('X-CP1255', Value) = 1) then
  1193.     Result := CP1255
  1194.   else
  1195.   if (Pos('WINDOWS-1256', Value) = 1) or (Pos('X-CP1256', Value) = 1) then
  1196.     Result := CP1256
  1197.   else
  1198.   if (Pos('WINDOWS-1257', Value) = 1) or (Pos('X-CP1257', Value) = 1) then
  1199.     Result := CP1257
  1200.   else
  1201.   if (Pos('WINDOWS-1258', Value) = 1) or (Pos('X-CP1258', Value) = 1) then
  1202.     Result := CP1258
  1203.   else
  1204.   if Pos('KOI8-R', Value) = 1 then
  1205.     Result := KOI8_R
  1206.   else
  1207.   if (Pos('KAMENICKY', Value) > 0) or (Pos('895', Value) > 0) then
  1208.     Result := CP895
  1209.   else
  1210.   if (Pos('LATIN-2', Value) > 0) or (Pos('852', Value) > 0) then
  1211.     Result := CP852
  1212.   else
  1213.   if Pos('UTF-7', Value) = 1 then
  1214.     Result := UTF_7
  1215.   else
  1216.   if Pos('UTF-8', Value) > 0 then
  1217.     Result := UTF_8
  1218.   else
  1219.   if Pos('UCS-4', Value) > 0 then
  1220.     Result := UCS_4
  1221.   else
  1222.   if Pos('UCS-2', Value) > 0 then
  1223.     Result := UCS_2
  1224.   else
  1225.   if Pos('UNICODE', Value) = 1 then
  1226.     Result := UCS_2
  1227. end;
  1228.  
  1229. {==============================================================================}
  1230. function GetIDFromCP(Value: TMimeChar): string;
  1231. begin
  1232.   case Value of
  1233.     ISO_8859_2:
  1234.       Result := 'ISO-8859-2';
  1235.     ISO_8859_3:
  1236.       Result := 'ISO-8859-3';
  1237.     ISO_8859_4:
  1238.       Result := 'ISO-8859-4';
  1239.     ISO_8859_5:
  1240.       Result := 'ISO-8859-5';
  1241.     ISO_8859_6:
  1242.       Result := 'ISO-8859-6';
  1243.     ISO_8859_7:
  1244.       Result := 'ISO-8859-7';
  1245.     ISO_8859_8:
  1246.       Result := 'ISO-8859-8';
  1247.     ISO_8859_9:
  1248.       Result := 'ISO-8859-9';
  1249.     ISO_8859_10:
  1250.       Result := 'ISO-8859-10';
  1251.     ISO_8859_13:
  1252.       Result := 'ISO-8859-13';
  1253.     ISO_8859_14:
  1254.       Result := 'ISO-8859-14';
  1255.     ISO_8859_15:
  1256.       Result := 'ISO-8859-15';
  1257.     CP1250:
  1258.       Result := 'WINDOWS-1250';
  1259.     CP1251:
  1260.       Result := 'WINDOWS-1251';
  1261.     CP1252:
  1262.       Result := 'WINDOWS-1252';
  1263.     CP1253:
  1264.       Result := 'WINDOWS-1253';
  1265.     CP1254:
  1266.       Result := 'WINDOWS-1254';
  1267.     CP1255:
  1268.       Result := 'WINDOWS-1255';
  1269.     CP1256:
  1270.       Result := 'WINDOWS-1256';
  1271.     CP1257:
  1272.       Result := 'WINDOWS-1257';
  1273.     CP1258:
  1274.       Result := 'WINDOWS-1258';
  1275.     KOI8_R:
  1276.       Result := 'KOI8-R';
  1277.     CP895:
  1278.       Result := 'CP-895';
  1279.     CP852:
  1280.       Result := 'CP-852';
  1281.     UCS_2:
  1282.       Result := 'Unicode-1-1-UCS-2';
  1283.     UCS_4:
  1284.       Result := 'Unicode-1-1-UCS-4';
  1285.     UTF_8:
  1286.       Result := 'UTF-8';
  1287.     UTF_7:
  1288.       Result := 'UTF-7';
  1289.   else
  1290.     Result := 'ISO-8859-1';
  1291.   end;
  1292. end;
  1293.  
  1294. {==============================================================================}
  1295. function NeedCharsetConversion(const Value: string): Boolean;
  1296. var
  1297.   n: Integer;
  1298. begin
  1299.   Result := False;
  1300.   for n := 1 to Length(Value) do
  1301.     if Ord(Value[n]) > 127 then
  1302.     begin
  1303.       Result := True;
  1304.       Break;
  1305.     end;
  1306. end;
  1307.  
  1308. {==============================================================================}
  1309. function IdealCharsetCoding(const Value: string; CharFrom: TMimeChar;
  1310.   CharTo: TMimeSetChar): TMimeChar;
  1311. var
  1312.   n, m: Integer;
  1313.   min, x: Integer;
  1314.   s, t: string;
  1315. begin
  1316.   Result := ISO_8859_1;
  1317.   s := '';
  1318.   for n := 1 to Length(Value) do
  1319.     if Ord(Value[n]) > 127 then
  1320.       s := s + Value[n];
  1321.   min := 128;
  1322.   for n := Ord(Low(TMimeChar)) to Ord(High(TMimeChar)) do
  1323.     if TMimeChar(n) in CharTo then
  1324.     begin
  1325.       t := CharsetConversion(s, CharFrom, TMimeChar(n));
  1326.       x := 0;
  1327.       for m := 1 to Length(t) do
  1328.         if t[m] = NotFoundChar then
  1329.           Inc(x);
  1330.       if x < min then
  1331.       begin
  1332.         min := x;
  1333.         Result := TMimeChar(n);
  1334.         if x = 0 then
  1335.           Break;
  1336.       end;
  1337.     end;
  1338. end;
  1339.  
  1340. end.
  1341.