synachar.pas 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031
  1. {==============================================================================|
  2. | Project : Ararat Synapse | 005.002.002 |
  3. |==============================================================================|
  4. | Content: Charset conversion support |
  5. |==============================================================================|
  6. | Copyright (c)1999-2004, 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-2004. |
  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. {: @abstract(Charset conversion support)
  45. This unit contains a routines for lot of charset conversions.
  46. It using built-in conversion tables or external Iconv library. Iconv is used
  47. when needed conversion is known by Iconv library. When Iconv library is not
  48. found or Iconv not know requested conversion, then are internal routines used
  49. for conversion. (You can disable Iconv support from your program too!)
  50. Internal routines knows all major charsets for Europe or America. For East-Asian
  51. charsets you must use Iconv library!
  52. }
  53. {$IFDEF FPC}
  54. {$MODE DELPHI}
  55. {$ENDIF}
  56. {$Q-}
  57. {$H+}
  58. unit synachar;
  59. interface
  60. uses
  61. {$IFNDEF WIN32}
  62. {$IFNDEF FPC}
  63. Libc,
  64. {$ELSE}
  65. {$IFDEF FPC_USE_LIBC}
  66. Libc,
  67. {$ENDIF}
  68. {$ENDIF}
  69. {$ELSE}
  70. Windows,
  71. {$ENDIF}
  72. SysUtils,
  73. synautil, synacode, synaicnv;
  74. type
  75. {:Type with all supported charsets.}
  76. TMimeChar = (ISO_8859_1, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5,
  77. ISO_8859_6, ISO_8859_7, ISO_8859_8, ISO_8859_9, ISO_8859_10, ISO_8859_13,
  78. ISO_8859_14, ISO_8859_15, CP1250, CP1251, CP1252, CP1253, CP1254, CP1255,
  79. CP1256, CP1257, CP1258, KOI8_R, CP895, CP852, UCS_2, UCS_4, UTF_8, UTF_7,
  80. UTF_7mod, UCS_2LE, UCS_4LE,
  81. //next is supported by Iconv only...
  82. UTF_16, UTF_16LE, UTF_32, UTF_32LE, C99, JAVA, ISO_8859_16, KOI8_U, KOI8_RU,
  83. CP862, CP866, MAC, MACCE, MACICE, MACCRO, MACRO, MACCYR, MACUK, MACGR, MACTU,
  84. MACHEB, MACAR, MACTH, ROMAN8, NEXTSTEP, ARMASCII, GEORGIAN_AC, GEORGIAN_PS,
  85. KOI8_T, MULELAO, CP1133, TIS620, CP874, VISCII, TCVN, ISO_IR_14, JIS_X0201,
  86. JIS_X0208, JIS_X0212, GB1988_80, GB2312_80, ISO_IR_165, ISO_IR_149, EUC_JP,
  87. SHIFT_JIS, CP932, ISO_2022_JP, ISO_2022_JP1, ISO_2022_JP2, GB2312, CP936,
  88. GB18030, ISO_2022_CN, ISO_2022_CNE, HZ, EUC_TW, BIG5, CP950, BIG5_HKSCS,
  89. EUC_KR, CP949, CP1361, ISO_2022_KR, CP737, CP775, CP853, CP855, CP857,
  90. CP858, CP860, CP861, CP863, CP864, CP865, CP869, CP1125);
  91. {:Set of any charsets.}
  92. TMimeSetChar = set of TMimeChar;
  93. const
  94. {:Set of charsets supported by Iconv library only.}
  95. IconvOnlyChars: set of TMimeChar = [UTF_16, UTF_16LE, UTF_32, UTF_32LE,
  96. C99, JAVA, ISO_8859_16, KOI8_U, KOI8_RU, CP862, CP866, MAC, MACCE, MACICE,
  97. MACCRO, MACRO, MACCYR, MACUK, MACGR, MACTU, MACHEB, MACAR, MACTH, ROMAN8,
  98. NEXTSTEP, ARMASCII, GEORGIAN_AC, GEORGIAN_PS, KOI8_T, MULELAO, CP1133,
  99. TIS620, CP874, VISCII, TCVN, ISO_IR_14, JIS_X0201, JIS_X0208, JIS_X0212,
  100. GB1988_80, GB2312_80, ISO_IR_165, ISO_IR_149, EUC_JP, SHIFT_JIS, CP932,
  101. ISO_2022_JP, ISO_2022_JP1, ISO_2022_JP2, GB2312, CP936, GB18030,
  102. ISO_2022_CN, ISO_2022_CNE, HZ, EUC_TW, BIG5, CP950, BIG5_HKSCS, EUC_KR,
  103. CP949, CP1361, ISO_2022_KR, CP737, CP775, CP853, CP855, CP857, CP858,
  104. CP860, CP861, CP863, CP864, CP865, CP869, CP1125];
  105. {:Set of charsets supported by internal routines only.}
  106. NoIconvChars: set of TMimeChar = [CP895, UTF_7mod];
  107. {:null character replace table. (Usable for disable charater replacing.)}
  108. Replace_None: array[0..0] of Word =
  109. (0);
  110. {:Character replace table for remove Czech diakritics.}
  111. Replace_Czech: array[0..59] of Word =
  112. (
  113. $00E1, $0061,
  114. $010D, $0063,
  115. $010F, $0064,
  116. $010E, $0044,
  117. $00E9, $0065,
  118. $011B, $0065,
  119. $00ED, $0069,
  120. $0148, $006E,
  121. $00F3, $006F,
  122. $0159, $0072,
  123. $0161, $0073,
  124. $0165, $0074,
  125. $00FA, $0075,
  126. $016F, $0075,
  127. $00FD, $0079,
  128. $017E, $007A,
  129. $00C1, $0041,
  130. $010C, $0043,
  131. $00C9, $0045,
  132. $011A, $0045,
  133. $00CD, $0049,
  134. $0147, $004E,
  135. $00D3, $004F,
  136. $0158, $0052,
  137. $0160, $0053,
  138. $0164, $0054,
  139. $00DA, $0055,
  140. $016E, $0055,
  141. $00DD, $0059,
  142. $017D, $005A
  143. );
  144. var
  145. {:By this you can generally disable/enable Iconv support.}
  146. DisableIconv: Boolean = False;
  147. {:Default set of charsets for @link(IdealCharsetCoding) function.}
  148. IdealCharsets: TMimeSetChar =
  149. [ISO_8859_1, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5,
  150. ISO_8859_6, ISO_8859_7, ISO_8859_8, ISO_8859_9, ISO_8859_10,
  151. KOI8_R, KOI8_U
  152. {$IFNDEF CIL} //error URW778 ??? :-O
  153. , GB2312, EUC_KR, ISO_2022_JP, EUC_TW
  154. {$ENDIF}
  155. ];
  156. {==============================================================================}
  157. {:Convert Value from one charset to another. See: @link(CharsetConversionEx)}
  158. function CharsetConversion(const Value: AnsiString; CharFrom: TMimeChar;
  159. CharTo: TMimeChar): AnsiString;
  160. {:Convert Value from one charset to another with additional character conversion.
  161. see: @link(Replace_None) and @link(Replace_Czech)}
  162. function CharsetConversionEx(const Value: AnsiString; CharFrom: TMimeChar;
  163. CharTo: TMimeChar; const TransformTable: array of Word): AnsiString;
  164. {:Convert Value from one charset to another with additional character conversion.
  165. This funtion is similar to @link(CharsetConversionEx), but you can disable
  166. transliteration of unconvertible characters.}
  167. function CharsetConversionTrans(Value: AnsiString; CharFrom: TMimeChar;
  168. CharTo: TMimeChar; const TransformTable: array of Word; Translit: Boolean): AnsiString;
  169. {:Returns charset used by operating system.}
  170. function GetCurCP: TMimeChar;
  171. {:Returns charset used by operating system as OEM charset. (in Windows DOS box,
  172. for example)}
  173. function GetCurOEMCP: TMimeChar;
  174. {:Converting string with charset name to TMimeChar.}
  175. function GetCPFromID(Value: AnsiString): TMimeChar;
  176. {:Converting TMimeChar to string with name of charset.}
  177. function GetIDFromCP(Value: TMimeChar): AnsiString;
  178. {:return @true when value need to be converted. (It is not 7-bit ASCII)}
  179. function NeedCharsetConversion(const Value: AnsiString): Boolean;
  180. {:Finding best target charset from set of TMimeChars with minimal count of
  181. unconvertible characters.}
  182. function IdealCharsetCoding(const Value: AnsiString; CharFrom: TMimeChar;
  183. CharTo: TMimeSetChar): TMimeChar;
  184. {:Return BOM (Byte Order Mark) for given unicode charset.}
  185. function GetBOM(Value: TMimeChar): AnsiString;
  186. {:Convert binary string with unicode content to WideString.}
  187. function StringToWide(const Value: AnsiString): WideString;
  188. {:Convert WideString to binary string with unicode content.}
  189. function WideToString(const Value: WideString): AnsiString;
  190. {==============================================================================}
  191. implementation
  192. //character transcoding tables X to UCS-2
  193. {
  194. //dummy table
  195. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  196. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  197. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  198. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  199. $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  200. $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  201. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  202. $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  203. $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  204. $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  205. $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  206. $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  207. $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  208. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  209. $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  210. $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF
  211. }
  212. const
  213. {Latin-1
  214. Danish, Dutch, English, Faeroese, Finnish, French, German, Icelandic,
  215. Irish, Italian, Norwegian, Portuguese, Spanish and Swedish.
  216. }
  217. CharISO_8859_1: array[128..255] of Word =
  218. (
  219. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  220. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  221. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  222. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  223. $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  224. $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  225. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  226. $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  227. $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  228. $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  229. $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  230. $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  231. $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  232. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  233. $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  234. $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF
  235. );
  236. {Latin-2
  237. Albanian, Czech, English, German, Hungarian, Polish, Rumanian,
  238. Serbo-Croatian, Slovak, Slovene and Swedish.
  239. }
  240. CharISO_8859_2: array[128..255] of Word =
  241. (
  242. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  243. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  244. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  245. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  246. $00A0, $0104, $02D8, $0141, $00A4, $013D, $015A, $00A7,
  247. $00A8, $0160, $015E, $0164, $0179, $00AD, $017D, $017B,
  248. $00B0, $0105, $02DB, $0142, $00B4, $013E, $015B, $02C7,
  249. $00B8, $0161, $015F, $0165, $017A, $02DD, $017E, $017C,
  250. $0154, $00C1, $00C2, $0102, $00C4, $0139, $0106, $00C7,
  251. $010C, $00C9, $0118, $00CB, $011A, $00CD, $00CE, $010E,
  252. $0110, $0143, $0147, $00D3, $00D4, $0150, $00D6, $00D7,
  253. $0158, $016E, $00DA, $0170, $00DC, $00DD, $0162, $00DF,
  254. $0155, $00E1, $00E2, $0103, $00E4, $013A, $0107, $00E7,
  255. $010D, $00E9, $0119, $00EB, $011B, $00ED, $00EE, $010F,
  256. $0111, $0144, $0148, $00F3, $00F4, $0151, $00F6, $00F7,
  257. $0159, $016F, $00FA, $0171, $00FC, $00FD, $0163, $02D9
  258. );
  259. {Latin-3
  260. Afrikaans, Catalan, English, Esperanto, French, Galician,
  261. German, Italian, Maltese and Turkish.
  262. }
  263. CharISO_8859_3: array[128..255] of Word =
  264. (
  265. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  266. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  267. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  268. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  269. $00A0, $0126, $02D8, $00A3, $00A4, $FFFD, $0124, $00A7,
  270. $00A8, $0130, $015E, $011E, $0134, $00AD, $FFFD, $017B,
  271. $00B0, $0127, $00B2, $00B3, $00B4, $00B5, $0125, $00B7,
  272. $00B8, $0131, $015F, $011F, $0135, $00BD, $FFFD, $017C,
  273. $00C0, $00C1, $00C2, $FFFD, $00C4, $010A, $0108, $00C7,
  274. $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  275. $FFFD, $00D1, $00D2, $00D3, $00D4, $0120, $00D6, $00D7,
  276. $011C, $00D9, $00DA, $00DB, $00DC, $016C, $015C, $00DF,
  277. $00E0, $00E1, $00E2, $FFFD, $00E4, $010B, $0109, $00E7,
  278. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  279. $FFFD, $00F1, $00F2, $00F3, $00F4, $0121, $00F6, $00F7,
  280. $011D, $00F9, $00FA, $00FB, $00FC, $016D, $015D, $02D9
  281. );
  282. {Latin-4
  283. Danish, English, Estonian, Finnish, German, Greenlandic,
  284. Lappish, Latvian, Lithuanian, Norwegian and Swedish.
  285. }
  286. CharISO_8859_4: array[128..255] of Word =
  287. (
  288. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  289. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  290. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  291. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  292. $00A0, $0104, $0138, $0156, $00A4, $0128, $013B, $00A7,
  293. $00A8, $0160, $0112, $0122, $0166, $00AD, $017D, $00AF,
  294. $00B0, $0105, $02DB, $0157, $00B4, $0129, $013C, $02C7,
  295. $00B8, $0161, $0113, $0123, $0167, $014A, $017E, $014B,
  296. $0100, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $012E,
  297. $010C, $00C9, $0118, $00CB, $0116, $00CD, $00CE, $012A,
  298. $0110, $0145, $014C, $0136, $00D4, $00D5, $00D6, $00D7,
  299. $00D8, $0172, $00DA, $00DB, $00DC, $0168, $016A, $00DF,
  300. $0101, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $012F,
  301. $010D, $00E9, $0119, $00EB, $0117, $00ED, $00EE, $012B,
  302. $0111, $0146, $014D, $0137, $00F4, $00F5, $00F6, $00F7,
  303. $00F8, $0173, $00FA, $00FB, $00FC, $0169, $016B, $02D9
  304. );
  305. {CYRILLIC
  306. Bulgarian, Bielorussian, English, Macedonian, Russian,
  307. Serbo-Croatian and Ukrainian.
  308. }
  309. CharISO_8859_5: array[128..255] of Word =
  310. (
  311. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  312. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  313. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  314. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  315. $00A0, $0401, $0402, $0403, $0404, $0405, $0406, $0407,
  316. $0408, $0409, $040A, $040B, $040C, $00AD, $040E, $040F,
  317. $0410, $0411, $0412, $0413, $0414, $0415, $0416, $0417,
  318. $0418, $0419, $041A, $041B, $041C, $041D, $041E, $041F,
  319. $0420, $0421, $0422, $0423, $0424, $0425, $0426, $0427,
  320. $0428, $0429, $042A, $042B, $042C, $042D, $042E, $042F,
  321. $0430, $0431, $0432, $0433, $0434, $0435, $0436, $0437,
  322. $0438, $0439, $043A, $043B, $043C, $043D, $043E, $043F,
  323. $0440, $0441, $0442, $0443, $0444, $0445, $0446, $0447,
  324. $0448, $0449, $044A, $044B, $044C, $044D, $044E, $044F,
  325. $2116, $0451, $0452, $0453, $0454, $0455, $0456, $0457,
  326. $0458, $0459, $045A, $045B, $045C, $00A7, $045E, $045F
  327. );
  328. {ARABIC
  329. }
  330. CharISO_8859_6: array[128..255] of Word =
  331. (
  332. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  333. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  334. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  335. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  336. $00A0, $FFFD, $FFFD, $FFFD, $00A4, $FFFD, $FFFD, $FFFD,
  337. $FFFD, $FFFD, $FFFD, $FFFD, $060C, $00AD, $FFFD, $FFFD,
  338. $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  339. $FFFD, $FFFD, $FFFD, $061B, $FFFD, $FFFD, $FFFD, $061F,
  340. $FFFD, $0621, $0622, $0623, $0624, $0625, $0626, $0627,
  341. $0628, $0629, $062A, $062B, $062C, $062D, $062E, $062F,
  342. $0630, $0631, $0632, $0633, $0634, $0635, $0636, $0637,
  343. $0638, $0639, $063A, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  344. $0640, $0641, $0642, $0643, $0644, $0645, $0646, $0647,
  345. $0648, $0649, $064A, $064B, $064C, $064D, $064E, $064F,
  346. $0650, $0651, $0652, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  347. $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD
  348. );
  349. {GREEK
  350. }
  351. CharISO_8859_7: array[128..255] of Word =
  352. (
  353. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  354. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  355. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  356. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  357. $00A0, $2018, $2019, $00A3, $FFFD, $FFFD, $00A6, $00A7,
  358. $00A8, $00A9, $FFFD, $00AB, $00AC, $00AD, $FFFD, $2015,
  359. $00B0, $00B1, $00B2, $00B3, $0384, $0385, $0386, $00B7,
  360. $0388, $0389, $038A, $00BB, $038C, $00BD, $038E, $038F,
  361. $0390, $0391, $0392, $0393, $0394, $0395, $0396, $0397,
  362. $0398, $0399, $039A, $039B, $039C, $039D, $039E, $039F,
  363. $03A0, $03A1, $FFFD, $03A3, $03A4, $03A5, $03A6, $03A7,
  364. $03A8, $03A9, $03AA, $03AB, $03AC, $03AD, $03AE, $03AF,
  365. $03B0, $03B1, $03B2, $03B3, $03B4, $03B5, $03B6, $03B7,
  366. $03B8, $03B9, $03BA, $03BB, $03BC, $03BD, $03BE, $03BF,
  367. $03C0, $03C1, $03C2, $03C3, $03C4, $03C5, $03C6, $03C7,
  368. $03C8, $03C9, $03CA, $03CB, $03CC, $03CD, $03CE, $FFFD
  369. );
  370. {HEBREW
  371. }
  372. CharISO_8859_8: array[128..255] of Word =
  373. (
  374. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  375. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  376. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  377. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  378. $00A0, $FFFD, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  379. $00A8, $00A9, $00D7, $00AB, $00AC, $00AD, $00AE, $00AF,
  380. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  381. $00B8, $00B9, $00F7, $00BB, $00BC, $00BD, $00BE, $FFFD,
  382. $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  383. $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  384. $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  385. $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $2017,
  386. $05D0, $05D1, $05D2, $05D3, $05D4, $05D5, $05D6, $05D7,
  387. $05D8, $05D9, $05DA, $05DB, $05DC, $05DD, $05DE, $05DF,
  388. $05E0, $05E1, $05E2, $05E3, $05E4, $05E5, $05E6, $05E7,
  389. $05E8, $05E9, $05EA, $FFFD, $FFFD, $200E, $200F, $FFFD
  390. );
  391. {Latin-5
  392. English, Finnish, French, German, Irish, Italian, Norwegian,
  393. Portuguese, Spanish, Swedish and Turkish.
  394. }
  395. CharISO_8859_9: array[128..255] of Word =
  396. (
  397. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  398. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  399. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  400. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  401. $00A0, $0104, $02D8, $0141, $00A4, $013D, $015A, $00A7,
  402. $00A8, $0160, $015E, $0164, $0179, $00AD, $017D, $017B,
  403. $00B0, $0105, $02DB, $0142, $00B4, $013E, $015B, $02C7,
  404. $00B8, $0161, $015F, $0165, $017A, $02DD, $017E, $017C,
  405. $0154, $00C1, $00C2, $0102, $00C4, $0139, $0106, $00C7,
  406. $010C, $00C9, $0118, $00CB, $011A, $00CD, $00CE, $010E,
  407. $011E, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  408. $00D8, $00D9, $00DA, $00DB, $00DC, $0130, $015E, $00DF,
  409. $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  410. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  411. $011F, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  412. $00F8, $00F9, $00FA, $00FB, $00FC, $0131, $015F, $00FF
  413. );
  414. {Latin-6
  415. Danish, English, Estonian, Faeroese, Finnish, German, Greenlandic,
  416. Icelandic, Lappish, Latvian, Lithuanian, Norwegian and Swedish.
  417. }
  418. CharISO_8859_10: array[128..255] of Word =
  419. (
  420. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  421. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  422. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  423. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  424. $00A0, $0104, $0112, $0122, $012A, $0128, $0136, $00A7,
  425. $013B, $0110, $0160, $0166, $017D, $00AD, $016A, $014A,
  426. $00B0, $0105, $0113, $0123, $012B, $0129, $0137, $00B7,
  427. $013C, $0111, $0161, $0167, $017E, $2015, $016B, $014B,
  428. $0100, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $012E,
  429. $010C, $00C9, $0118, $00CB, $0116, $00CD, $00CE, $00CF,
  430. $00D0, $0145, $014C, $00D3, $00D4, $00D5, $00D6, $0168,
  431. $00D8, $0172, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  432. $0101, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $012F,
  433. $010D, $00E9, $0119, $00EB, $0117, $00ED, $00EE, $00EF,
  434. $00F0, $0146, $014D, $00F3, $00F4, $00F5, $00F6, $0169,
  435. $00F8, $0173, $00FA, $00FB, $00FC, $00FD, $00FE, $0138
  436. );
  437. CharISO_8859_13: array[128..255] of Word =
  438. (
  439. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  440. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  441. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  442. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  443. $00A0, $201D, $00A2, $00A3, $00A4, $201E, $00A6, $00A7,
  444. $00D8, $00A9, $0156, $00AB, $00AC, $00AD, $00AE, $00C6,
  445. $00B0, $00B1, $00B2, $00B3, $201C, $00B5, $00B6, $00B7,
  446. $00F8, $00B9, $0157, $00BB, $00BC, $00BD, $00BE, $00E6,
  447. $0104, $012E, $0100, $0106, $00C4, $00C5, $0118, $0112,
  448. $010C, $00C9, $0179, $0116, $0122, $0136, $012A, $013B,
  449. $0160, $0143, $0145, $00D3, $014C, $00D5, $00D6, $00D7,
  450. $0172, $0141, $015A, $016A, $00DC, $017B, $017D, $00DF,
  451. $0105, $012F, $0101, $0107, $00E4, $00E5, $0119, $0113,
  452. $010D, $00E9, $017A, $0117, $0123, $0137, $012B, $013C,
  453. $0161, $0144, $0146, $00F3, $014D, $00F5, $00F6, $00F7,
  454. $0173, $0142, $015B, $016B, $00FC, $017C, $017E, $2019
  455. );
  456. CharISO_8859_14: array[128..255] of Word =
  457. (
  458. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  459. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  460. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  461. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  462. $00A0, $1E02, $1E03, $00A3, $010A, $010B, $1E0A, $00A7,
  463. $1E80, $00A9, $1E82, $1E0B, $1EF2, $00AD, $00AE, $0178,
  464. $1E1E, $1E1F, $0120, $0121, $1E40, $1E41, $00B6, $1E56,
  465. $1E81, $1E57, $1E83, $1E60, $1EF3, $1E84, $1E85, $1E61,
  466. $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  467. $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  468. $0174, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $1E6A,
  469. $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $0176, $00DF,
  470. $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  471. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  472. $0175, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $1E6B,
  473. $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $0177, $00FF
  474. );
  475. CharISO_8859_15: array[128..255] of Word =
  476. (
  477. $0080, $0081, $0082, $0083, $0084, $0085, $0086, $0087,
  478. $0088, $0089, $008A, $008B, $008C, $008D, $008E, $008F,
  479. $0090, $0091, $0092, $0093, $0094, $0095, $0096, $0097,
  480. $0098, $0099, $009A, $009B, $009C, $009D, $009E, $009F,
  481. $00A0, $00A1, $00A2, $00A3, $20AC, $00A5, $0160, $00A7,
  482. $0161, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  483. $00B0, $00B1, $00B2, $00B3, $017D, $00B5, $00B6, $00B7,
  484. $017E, $00B9, $00BA, $00BB, $0152, $0153, $0178, $00BF,
  485. $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  486. $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  487. $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  488. $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  489. $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  490. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  491. $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  492. $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF
  493. );
  494. {Eastern European
  495. }
  496. CharCP_1250: array[128..255] of Word =
  497. (
  498. $20AC, $FFFD, $201A, $FFFD, $201E, $2026, $2020, $2021,
  499. $FFFD, $2030, $0160, $2039, $015A, $0164, $017D, $0179,
  500. $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  501. $FFFD, $2122, $0161, $203A, $015B, $0165, $017E, $017A,
  502. $00A0, $02C7, $02D8, $0141, $00A4, $0104, $00A6, $00A7,
  503. $00A8, $00A9, $015E, $00AB, $00AC, $00AD, $00AE, $017B,
  504. $00B0, $00B1, $02DB, $0142, $00B4, $00B5, $00B6, $00B7,
  505. $00B8, $0105, $015F, $00BB, $013D, $02DD, $013E, $017C,
  506. $0154, $00C1, $00C2, $0102, $00C4, $0139, $0106, $00C7,
  507. $010C, $00C9, $0118, $00CB, $011A, $00CD, $00CE, $010E,
  508. $0110, $0143, $0147, $00D3, $00D4, $0150, $00D6, $00D7,
  509. $0158, $016E, $00DA, $0170, $00DC, $00DD, $0162, $00DF,
  510. $0155, $00E1, $00E2, $0103, $00E4, $013A, $0107, $00E7,
  511. $010D, $00E9, $0119, $00EB, $011B, $00ED, $00EE, $010F,
  512. $0111, $0144, $0148, $00F3, $00F4, $0151, $00F6, $00F7,
  513. $0159, $016F, $00FA, $0171, $00FC, $00FD, $0163, $02D9
  514. );
  515. {Cyrillic
  516. }
  517. CharCP_1251: array[128..255] of Word =
  518. (
  519. $0402, $0403, $201A, $0453, $201E, $2026, $2020, $2021,
  520. $20AC, $2030, $0409, $2039, $040A, $040C, $040B, $040F,
  521. $0452, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  522. $FFFD, $2122, $0459, $203A, $045A, $045C, $045B, $045F,
  523. $00A0, $040E, $045E, $0408, $00A4, $0490, $00A6, $00A7,
  524. $0401, $00A9, $0404, $00AB, $00AC, $00AD, $00AE, $0407,
  525. $00B0, $00B1, $0406, $0456, $0491, $00B5, $00B6, $00B7,
  526. $0451, $2116, $0454, $00BB, $0458, $0405, $0455, $0457,
  527. $0410, $0411, $0412, $0413, $0414, $0415, $0416, $0417,
  528. $0418, $0419, $041A, $041B, $041C, $041D, $041E, $041F,
  529. $0420, $0421, $0422, $0423, $0424, $0425, $0426, $0427,
  530. $0428, $0429, $042A, $042B, $042C, $042D, $042E, $042F,
  531. $0430, $0431, $0432, $0433, $0434, $0435, $0436, $0437,
  532. $0438, $0439, $043A, $043B, $043C, $043D, $043E, $043F,
  533. $0440, $0441, $0442, $0443, $0444, $0445, $0446, $0447,
  534. $0448, $0449, $044A, $044B, $044C, $044D, $044E, $044F
  535. );
  536. {Latin-1 (US, Western Europe)
  537. }
  538. CharCP_1252: array[128..255] of Word =
  539. (
  540. $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  541. $02C6, $2030, $0160, $2039, $0152, $FFFD, $017D, $FFFD,
  542. $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  543. $02DC, $2122, $0161, $203A, $0153, $FFFD, $017E, $0178,
  544. $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  545. $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  546. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  547. $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  548. $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  549. $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  550. $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  551. $00D8, $00D9, $00DA, $00DB, $00DC, $00DD, $00DE, $00DF,
  552. $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  553. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  554. $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  555. $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF
  556. );
  557. {Greek
  558. }
  559. CharCP_1253: array[128..255] of Word =
  560. (
  561. $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  562. $FFFD, $2030, $FFFD, $2039, $FFFD, $FFFD, $FFFD, $FFFD,
  563. $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  564. $FFFD, $2122, $FFFD, $203A, $FFFD, $FFFD, $FFFD, $FFFD,
  565. $00A0, $0385, $0386, $00A3, $00A4, $00A5, $00A6, $00A7,
  566. $00A8, $00A9, $FFFD, $00AB, $00AC, $00AD, $00AE, $2015,
  567. $00B0, $00B1, $00B2, $00B3, $0384, $00B5, $00B6, $00B7,
  568. $0388, $0389, $038A, $00BB, $038C, $00BD, $038E, $038F,
  569. $0390, $0391, $0392, $0393, $0394, $0395, $0396, $0397,
  570. $0398, $0399, $039A, $039B, $039C, $039D, $039E, $039F,
  571. $03A0, $03A1, $FFFD, $03A3, $03A4, $03A5, $03A6, $03A7,
  572. $03A8, $03A9, $03AA, $03AB, $03AC, $03AD, $03AE, $03AF,
  573. $03B0, $03B1, $03B2, $03B3, $03B4, $03B5, $03B6, $03B7,
  574. $03B8, $03B9, $03BA, $03BB, $03BC, $03BD, $03BE, $03BF,
  575. $03C0, $03C1, $03C2, $03C3, $03C4, $03C5, $03C6, $03C7,
  576. $03C8, $03C9, $03CA, $03CB, $03CC, $03CD, $03CE, $FFFD
  577. );
  578. {Turkish
  579. }
  580. CharCP_1254: array[128..255] of Word =
  581. (
  582. $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  583. $02C6, $2030, $0160, $2039, $0152, $FFFD, $FFFD, $FFFD,
  584. $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  585. $02DC, $2122, $0161, $203A, $0153, $FFFD, $FFFD, $0178,
  586. $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  587. $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  588. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  589. $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  590. $00C0, $00C1, $00C2, $00C3, $00C4, $00C5, $00C6, $00C7,
  591. $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
  592. $011E, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7,
  593. $00D8, $00D9, $00DA, $00DB, $00DC, $0130, $015E, $00DF,
  594. $00E0, $00E1, $00E2, $00E3, $00E4, $00E5, $00E6, $00E7,
  595. $00E8, $00E9, $00EA, $00EB, $00EC, $00ED, $00EE, $00EF,
  596. $011F, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
  597. $00F8, $00F9, $00FA, $00FB, $00FC, $0131, $015F, $00FF
  598. );
  599. {Hebrew
  600. }
  601. CharCP_1255: array[128..255] of Word =
  602. (
  603. $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  604. $02C6, $2030, $FFFD, $2039, $FFFD, $FFFD, $FFFD, $FFFD,
  605. $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  606. $02DC, $2122, $FFFD, $203A, $FFFD, $FFFD, $FFFD, $FFFD,
  607. $00A0, $00A1, $00A2, $00A3, $20AA, $00A5, $00A6, $00A7,
  608. $00A8, $00A9, $00D7, $00AB, $00AC, $00AD, $00AE, $00AF,
  609. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  610. $00B8, $00B9, $00F7, $00BB, $00BC, $00BD, $00BE, $00BF,
  611. $05B0, $05B1, $05B2, $05B3, $05B4, $05B5, $05B6, $05B7,
  612. $05B8, $05B9, $FFFD, $05BB, $05BC, $05BD, $05BE, $05BF,
  613. $05C0, $05C1, $05C2, $05C3, $05F0, $05F1, $05F2, $05F3,
  614. $05F4, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD, $FFFD,
  615. $05D0, $05D1, $05D2, $05D3, $05D4, $05D5, $05D6, $05D7,
  616. $05D8, $05D9, $05DA, $05DB, $05DC, $05DD, $05DE, $05DF,
  617. $05E0, $05E1, $05E2, $05E3, $05E4, $05E5, $05E6, $05E7,
  618. $05E8, $05E9, $05EA, $FFFD, $FFFD, $200E, $200F, $FFFD
  619. );
  620. {Arabic
  621. }
  622. CharCP_1256: array[128..255] of Word =
  623. (
  624. $20AC, $067E, $201A, $0192, $201E, $2026, $2020, $2021,
  625. $02C6, $2030, $0679, $2039, $0152, $0686, $0698, $0688,
  626. $06AF, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  627. $06A9, $2122, $0691, $203A, $0153, $200C, $200D, $06BA,
  628. $00A0, $060C, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  629. $00A8, $00A9, $06BE, $00AB, $00AC, $00AD, $00AE, $00AF,
  630. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  631. $00B8, $00B9, $061B, $00BB, $00BC, $00BD, $00BE, $061F,
  632. $06C1, $0621, $0622, $0623, $0624, $0625, $0626, $0627,
  633. $0628, $0629, $062A, $062B, $062C, $062D, $062E, $062F,
  634. $0630, $0631, $0632, $0633, $0634, $0635, $0636, $00D7,
  635. $0637, $0638, $0639, $063A, $0640, $0641, $0642, $0643,
  636. $00E0, $0644, $00E2, $0645, $0646, $0647, $0648, $00E7,
  637. $00E8, $00E9, $00EA, $00EB, $0649, $064A, $00EE, $00EF,
  638. $064B, $064C, $064D, $064E, $00F4, $064F, $0650, $00F7,
  639. $0651, $00F9, $0652, $00FB, $00FC, $200E, $200F, $06D2
  640. );
  641. {Baltic
  642. }
  643. CharCP_1257: array[128..255] of Word =
  644. (
  645. $20AC, $FFFD, $201A, $FFFD, $201E, $2026, $2020, $2021,
  646. $FFFD, $2030, $FFFD, $2039, $FFFD, $00A8, $02C7, $00B8,
  647. $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  648. $FFFD, $2122, $FFFD, $203A, $FFFD, $00AF, $02DB, $FFFD,
  649. $00A0, $FFFD, $00A2, $00A3, $00A4, $FFFD, $00A6, $00A7,
  650. $00D8, $00A9, $0156, $00AB, $00AC, $00AD, $00AE, $00C6,
  651. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  652. $00F8, $00B9, $0157, $00BB, $00BC, $00BD, $00BE, $00E6,
  653. $0104, $012E, $0100, $0106, $00C4, $00C5, $0118, $0112,
  654. $010C, $00C9, $0179, $0116, $0122, $0136, $012A, $013B,
  655. $0160, $0143, $0145, $00D3, $014C, $00D5, $00D6, $00D7,
  656. $0172, $0141, $015A, $016A, $00DC, $017B, $017D, $00DF,
  657. $0105, $012F, $0101, $0107, $00E4, $00E5, $0119, $0113,
  658. $010D, $00E9, $017A, $0117, $0123, $0137, $012B, $013C,
  659. $0161, $0144, $0146, $00F3, $014D, $00F5, $00F6, $00F7,
  660. $0173, $0142, $015B, $016B, $00FC, $017C, $017E, $02D9
  661. );
  662. {Vietnamese
  663. }
  664. CharCP_1258: array[128..255] of Word =
  665. (
  666. $20AC, $FFFD, $201A, $0192, $201E, $2026, $2020, $2021,
  667. $02C6, $2030, $FFFD, $2039, $0152, $FFFD, $FFFD, $FFFD,
  668. $FFFD, $2018, $2019, $201C, $201D, $2022, $2013, $2014,
  669. $02DC, $2122, $FFFD, $203A, $0153, $FFFD, $FFFD, $0178,
  670. $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
  671. $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF,
  672. $00B0, $00B1, $00B2, $00B3, $00B4, $00B5, $00B6, $00B7,
  673. $00B8, $00B9, $00BA, $00BB, $00BC, $00BD, $00BE, $00BF,
  674. $00C0, $00C1, $00C2, $0102, $00C4, $00C5, $00C6, $00C7,
  675. $00C8, $00C9, $00CA, $00CB, $0300, $00CD, $00CE, $00CF,
  676. $0110, $00D1, $0309, $00D3, $00D4, $01A0, $00D6, $00D7,
  677. $00D8, $00D9, $00DA, $00DB, $00DC, $01AF, $0303, $00DF,
  678. $00E0, $00E1, $00E2, $0103, $00E4, $00E5, $00E6, $00E7,
  679. $00E8, $00E9, $00EA, $00EB, $0301, $00ED, $00EE, $00EF,
  680. $0111, $00F1, $0323, $00F3, $00F4, $01A1, $00F6, $00F7,
  681. $00F8, $00F9, $00FA, $00FB, $00FC, $01B0, $20AB, $00FF
  682. );
  683. {Cyrillic
  684. }
  685. CharKOI8_R: array[128..255] of Word =
  686. (
  687. $2500, $2502, $250C, $2510, $2514, $2518, $251C, $2524,
  688. $252C, $2534, $253C, $2580, $2584, $2588, $258C, $2590,
  689. $2591, $2592, $2593, $2320, $25A0, $2219, $221A, $2248,
  690. $2264, $2265, $00A0, $2321, $00B0, $00B2, $00B7, $00F7,
  691. $2550, $2551, $2552, $0451, $2553, $2554, $2555, $2556,
  692. $2557, $2558, $2559, $255A, $255B, $255C, $255D, $255E,
  693. $255F, $2560, $2561, $0401, $2562, $2563, $2564, $2565,
  694. $2566, $2567, $2568, $2569, $256A, $256B, $256C, $00A9,
  695. $044E, $0430, $0431, $0446, $0434, $0435, $0444, $0433,
  696. $0445, $0438, $0439, $043A, $043B, $043C, $043D, $043E,
  697. $043F, $044F, $0440, $0441, $0442, $0443, $0436, $0432,
  698. $044C, $044B, $0437, $0448, $044D, $0449, $0447, $044A,
  699. $042E, $0410, $0411, $0426, $0414, $0415, $0424, $0413,
  700. $0425, $0418, $0419, $041A, $041B, $041C, $041D, $041E,
  701. $041F, $042F, $0420, $0421, $0422, $0423, $0416, $0412,
  702. $042C, $042B, $0417, $0428, $042D, $0429, $0427, $042A
  703. );
  704. {Czech (Kamenicky)
  705. }
  706. CharCP_895: array[128..255] of Word =
  707. (
  708. $010C, $00FC, $00E9, $010F, $00E4, $010E, $0164, $010D,
  709. $011B, $011A, $0139, $00CD, $013E, $013A, $00C4, $00C1,
  710. $00C9, $017E, $017D, $00F4, $00F6, $00D3, $016F, $00DA,
  711. $00FD, $00D6, $00DC, $0160, $013D, $00DD, $0158, $0165,
  712. $00E1, $00ED, $00F3, $00FA, $0148, $0147, $016E, $00D4,
  713. $0161, $0159, $0155, $0154, $00BC, $00A7, $00AB, $00BB,
  714. $2591, $2592, $2593, $2502, $2524, $2561, $2562, $2556,
  715. $2555, $2563, $2551, $2557, $255D, $255C, $255B, $2510,
  716. $2514, $2534, $252C, $251C, $2500, $253C, $255E, $255F,
  717. $255A, $2554, $2569, $2566, $2560, $2550, $256C, $2567,
  718. $2568, $2564, $2565, $2559, $2558, $2552, $2553, $256B,
  719. $256A, $2518, $250C, $2588, $2584, $258C, $2590, $2580,
  720. $03B1, $03B2, $0393, $03C0, $03A3, $03C3, $03BC, $03C4,
  721. $03A6, $0398, $03A9, $03B4, $221E, $2205, $03B5, $2229,
  722. $2261, $00B1, $2265, $2264, $2320, $2321, $00F7, $2248,
  723. $2218, $00B7, $2219, $221A, $207F, $00B2, $25A0, $00A0
  724. );
  725. {Eastern European
  726. }
  727. CharCP_852: array[128..255] of Word =
  728. (
  729. $00C7, $00FC, $00E9, $00E2, $00E4, $016F, $0107, $00E7,
  730. $0142, $00EB, $0150, $0151, $00EE, $0179, $00C4, $0106,
  731. $00C9, $0139, $013A, $00F4, $00F6, $013D, $013E, $015A,
  732. $015B, $00D6, $00DC, $0164, $0165, $0141, $00D7, $010D,
  733. $00E1, $00ED, $00F3, $00FA, $0104, $0105, $017D, $017E,
  734. $0118, $0119, $00AC, $017A, $010C, $015F, $00AB, $00BB,
  735. $2591, $2592, $2593, $2502, $2524, $00C1, $00C2, $011A,
  736. $015E, $2563, $2551, $2557, $255D, $017B, $017C, $2510,
  737. $2514, $2534, $252C, $251C, $2500, $253C, $0102, $0103,
  738. $255A, $2554, $2569, $2566, $2560, $2550, $256C, $00A4,
  739. $0111, $0110, $010E, $00CB, $010F, $0147, $00CD, $00CE,
  740. $011B, $2518, $250C, $2588, $2584, $0162, $016E, $2580,
  741. $00D3, $00DF, $00D4, $0143, $0144, $0148, $0160, $0161,
  742. $0154, $00DA, $0155, $0170, $00FD, $00DD, $0163, $00B4,
  743. $00AD, $02DD, $02DB, $02C7, $02D8, $00A7, $00F7, $00B8,
  744. $00B0, $00A8, $02D9, $0171, $0158, $0159, $25A0, $00A0
  745. );
  746. {==============================================================================}
  747. type
  748. TIconvChar = record
  749. Charset: TMimeChar;
  750. CharName: string;
  751. end;
  752. TIconvArr = array [0..112] of TIconvChar;
  753. const
  754. NotFoundChar = '_';
  755. var
  756. SetTwo: set of TMimeChar = [UCS_2, UCS_2LE, UTF_7, UTF_7mod];
  757. SetFour: set of TMimeChar = [UCS_4, UCS_4LE, UTF_8];
  758. SetLE: set of TMimeChar = [UCS_2LE, UCS_4LE];
  759. IconvArr: TIconvArr;
  760. {==============================================================================}
  761. function FindIconvID(const Value, Charname: string): Boolean;
  762. var
  763. s: string;
  764. begin
  765. Result := True;
  766. //exact match
  767. if Value = Charname then
  768. Exit;
  769. //Value is on begin of charname
  770. s := Value + ' ';
  771. if s = Copy(Charname, 1, Length(s)) then
  772. Exit;
  773. //Value is on end of charname
  774. s := ' ' + Value;
  775. if s = Copy(Charname, Length(Charname) - Length(s) + 1, Length(s)) then
  776. Exit;
  777. //value is somewhere inside charname
  778. if Pos( s + ' ', Charname) > 0 then
  779. Exit;
  780. Result := False;
  781. end;
  782. function GetCPFromIconvID(Value: AnsiString): TMimeChar;
  783. var
  784. n: integer;
  785. begin
  786. Result := ISO_8859_1;
  787. Value := UpperCase(Value);
  788. for n := 0 to High(IconvArr) do
  789. if FindIconvID(Value, IconvArr[n].Charname) then
  790. begin
  791. Result := IconvArr[n].Charset;
  792. Break;
  793. end;
  794. end;
  795. {==============================================================================}
  796. function GetIconvIDFromCP(Value: TMimeChar): AnsiString;
  797. var
  798. n: integer;
  799. begin
  800. Result := 'ISO-8859-1';
  801. for n := 0 to High(IconvArr) do
  802. if IconvArr[n].Charset = Value then
  803. begin
  804. Result := Separateleft(IconvArr[n].Charname, ' ');
  805. Break;
  806. end;
  807. end;
  808. {==============================================================================}
  809. function ReplaceUnicode(Value: Word; const TransformTable: array of Word): Word;
  810. var
  811. n: integer;
  812. begin
  813. if High(TransformTable) <> 0 then
  814. for n := 0 to High(TransformTable) do
  815. if not odd(n) then
  816. if TransformTable[n] = Value then
  817. begin
  818. Value := TransformTable[n+1];
  819. break;
  820. end;
  821. Result := Value;
  822. end;
  823. {==============================================================================}
  824. procedure CopyArray(const SourceTable: array of Word;
  825. var TargetTable: array of Word);
  826. var
  827. n: Integer;
  828. begin
  829. for n := 0 to 127 do
  830. TargetTable[n] := SourceTable[n];
  831. end;
  832. {==============================================================================}
  833. procedure GetArray(CharSet: TMimeChar; var Result: array of Word);
  834. begin
  835. case CharSet of
  836. ISO_8859_2:
  837. CopyArray(CharISO_8859_2, Result);
  838. ISO_8859_3:
  839. CopyArray(CharISO_8859_3, Result);
  840. ISO_8859_4:
  841. CopyArray(CharISO_8859_4, Result);
  842. ISO_8859_5:
  843. CopyArray(CharISO_8859_5, Result);
  844. ISO_8859_6:
  845. CopyArray(CharISO_8859_6, Result);
  846. ISO_8859_7:
  847. CopyArray(CharISO_8859_7, Result);
  848. ISO_8859_8:
  849. CopyArray(CharISO_8859_8, Result);
  850. ISO_8859_9:
  851. CopyArray(CharISO_8859_9, Result);
  852. ISO_8859_10:
  853. CopyArray(CharISO_8859_10, Result);
  854. ISO_8859_13:
  855. CopyArray(CharISO_8859_13, Result);
  856. ISO_8859_14:
  857. CopyArray(CharISO_8859_14, Result);
  858. ISO_8859_15:
  859. CopyArray(CharISO_8859_15, Result);
  860. CP1250:
  861. CopyArray(CharCP_1250, Result);
  862. CP1251:
  863. CopyArray(CharCP_1251, Result);
  864. CP1252:
  865. CopyArray(CharCP_1252, Result);
  866. CP1253:
  867. CopyArray(CharCP_1253, Result);
  868. CP1254:
  869. CopyArray(CharCP_1254, Result);
  870. CP1255:
  871. CopyArray(CharCP_1255, Result);
  872. CP1256:
  873. CopyArray(CharCP_1256, Result);
  874. CP1257:
  875. CopyArray(CharCP_1257, Result);
  876. CP1258:
  877. CopyArray(CharCP_1258, Result);
  878. KOI8_R:
  879. CopyArray(CharKOI8_R, Result);
  880. CP895:
  881. CopyArray(CharCP_895, Result);
  882. CP852:
  883. CopyArray(CharCP_852, Result);
  884. else
  885. CopyArray(CharISO_8859_1, Result);
  886. end;
  887. end;
  888. {==============================================================================}
  889. procedure ReadMulti(const Value: AnsiString; var Index: Integer; mb: Byte;
  890. var b1, b2, b3, b4: Byte; le: boolean);
  891. Begin
  892. b1 := 0;
  893. b2 := 0;
  894. b3 := 0;
  895. b4 := 0;
  896. if Index < 0 then
  897. Index := 1;
  898. if mb > 4 then
  899. mb := 1;
  900. if (Index + mb - 1) <= Length(Value) then
  901. begin
  902. if le then
  903. Case mb Of
  904. 1:
  905. b1 := Ord(Value[Index]);
  906. 2:
  907. Begin
  908. b1 := Ord(Value[Index]);
  909. b2 := Ord(Value[Index + 1]);
  910. End;
  911. 3:
  912. Begin
  913. b1 := Ord(Value[Index]);
  914. b2 := Ord(Value[Index + 1]);
  915. b3 := Ord(Value[Index + 2]);
  916. End;
  917. 4:
  918. Begin
  919. b1 := Ord(Value[Index]);
  920. b2 := Ord(Value[Index + 1]);
  921. b3 := Ord(Value[Index + 2]);
  922. b4 := Ord(Value[Index + 3]);
  923. End;
  924. end
  925. else
  926. Case mb Of
  927. 1:
  928. b1 := Ord(Value[Index]);
  929. 2:
  930. Begin
  931. b2 := Ord(Value[Index]);
  932. b1 := Ord(Value[Index + 1]);
  933. End;
  934. 3:
  935. Begin
  936. b3 := Ord(Value[Index]);
  937. b2 := Ord(Value[Index + 1]);
  938. b1 := Ord(Value[Index + 2]);
  939. End;
  940. 4:
  941. Begin
  942. b4 := Ord(Value[Index]);
  943. b3 := Ord(Value[Index + 1]);
  944. b2 := Ord(Value[Index + 2]);
  945. b1 := Ord(Value[Index + 3]);
  946. End;
  947. end;
  948. end;
  949. Inc(Index, mb);
  950. end;
  951. {==============================================================================}
  952. function WriteMulti(b1, b2, b3, b4: Byte; mb: Byte; le: boolean): AnsiString;
  953. begin
  954. if mb > 4 then
  955. mb := 1;
  956. SetLength(Result, mb);
  957. if le then
  958. case mb Of
  959. 1:
  960. Result[1] := AnsiChar(b1);
  961. 2:
  962. begin
  963. Result[1] := AnsiChar(b1);
  964. Result[2] := AnsiChar(b2);
  965. end;
  966. 3:
  967. begin
  968. Result[1] := AnsiChar(b1);
  969. Result[2] := AnsiChar(b2);
  970. Result[3] := AnsiChar(b3);
  971. end;
  972. 4:
  973. begin
  974. Result[1] := AnsiChar(b1);
  975. Result[2] := AnsiChar(b2);
  976. Result[3] := AnsiChar(b3);
  977. Result[4] := AnsiChar(b4);
  978. end;
  979. end
  980. else
  981. case mb Of
  982. 1:
  983. Result[1] := AnsiChar(b1);
  984. 2:
  985. begin
  986. Result[2] := AnsiChar(b1);
  987. Result[1] := AnsiChar(b2);
  988. end;
  989. 3:
  990. begin
  991. Result[3] := AnsiChar(b1);
  992. Result[2] := AnsiChar(b2);
  993. Result[1] := AnsiChar(b3);
  994. end;
  995. 4:
  996. begin
  997. Result[4] := AnsiChar(b1);
  998. Result[3] := AnsiChar(b2);
  999. Result[2] := AnsiChar(b3);
  1000. Result[1] := AnsiChar(b4);
  1001. end;
  1002. end;
  1003. end;
  1004. {==============================================================================}
  1005. function UTF8toUCS4(const Value: AnsiString): AnsiString;
  1006. var
  1007. n, x, ul, m: Integer;
  1008. s: AnsiString;
  1009. w1, w2: Word;
  1010. begin
  1011. Result := '';
  1012. n := 1;
  1013. while Length(Value) >= n do
  1014. begin
  1015. x := Ord(Value[n]);
  1016. Inc(n);
  1017. if x < 128 then
  1018. Result := Result + WriteMulti(x, 0, 0, 0, 4, false)
  1019. else
  1020. begin
  1021. m := 0;
  1022. if (x and $E0) = $C0 then
  1023. m := $1F;
  1024. if (x and $F0) = $E0 then
  1025. m := $0F;
  1026. if (x and $F8) = $F0 then
  1027. m := $07;
  1028. if (x and $FC) = $F8 then
  1029. m := $03;
  1030. if (x and $FE) = $FC then
  1031. m := $01;
  1032. ul := x and m;
  1033. s := IntToBin(ul, 0);
  1034. while Length(Value) >= n do
  1035. begin
  1036. x := Ord(Value[n]);
  1037. Inc(n);
  1038. if (x and $C0) = $80 then
  1039. s := s + IntToBin(x and $3F, 6)
  1040. else
  1041. begin
  1042. Dec(n);
  1043. Break;
  1044. end;
  1045. end;
  1046. ul := BinToInt(s);
  1047. w1 := ul div 65536;
  1048. w2 := ul mod 65536;
  1049. Result := Result + WriteMulti(Lo(w2), Hi(w2), Lo(w1), Hi(w1), 4, false);
  1050. end;
  1051. end;
  1052. end;
  1053. {==============================================================================}
  1054. function UCS4toUTF8(const Value: AnsiString): AnsiString;
  1055. var
  1056. s, l, k: AnsiString;
  1057. b1, b2, b3, b4: Byte;
  1058. n, m, x, y: Integer;
  1059. b: Byte;
  1060. begin
  1061. Result := '';
  1062. n := 1;
  1063. while Length(Value) >= n do
  1064. begin
  1065. ReadMulti(Value, n, 4, b1, b2, b3, b4, false);
  1066. if (b2 = 0) and (b3 = 0) and (b4 = 0) and (b1 < 128) then
  1067. Result := Result + AnsiChar(b1)
  1068. else
  1069. begin
  1070. x := (b1 + 256 * b2) + (b3 + 256 * b4) * 65536;
  1071. l := IntToBin(x, 0);
  1072. y := Length(l) div 6;
  1073. s := '';
  1074. for m := 1 to y do
  1075. begin
  1076. k := Copy(l, Length(l) - 5, 6);
  1077. l := Copy(l, 1, Length(l) - 6);
  1078. b := BinToInt(k) or $80;
  1079. s := AnsiChar(b) + s;
  1080. end;
  1081. b := BinToInt(l);
  1082. case y of
  1083. 5:
  1084. b := b or $FC;
  1085. 4:
  1086. b := b or $F8;
  1087. 3:
  1088. b := b or $F0;
  1089. 2:
  1090. b := b or $E0;
  1091. 1:
  1092. b := b or $C0;
  1093. end;
  1094. s := AnsiChar(b) + s;
  1095. Result := Result + s;
  1096. end;
  1097. end;
  1098. end;
  1099. {==============================================================================}
  1100. function UTF7toUCS2(const Value: AnsiString; Modified: Boolean): AnsiString;
  1101. var
  1102. n, i: Integer;
  1103. c: AnsiChar;
  1104. s, t: AnsiString;
  1105. shift: AnsiChar;
  1106. table: String;
  1107. begin
  1108. Result := '';
  1109. n := 1;
  1110. if modified then
  1111. begin
  1112. shift := '&';
  1113. table := TableBase64mod;
  1114. end
  1115. else
  1116. begin
  1117. shift := '+';
  1118. table := TableBase64;
  1119. end;
  1120. while Length(Value) >= n do
  1121. begin
  1122. c := Value[n];
  1123. Inc(n);
  1124. if c <> shift then
  1125. Result := Result + WriteMulti(Ord(c), 0, 0, 0, 2, false)
  1126. else
  1127. begin
  1128. s := '';
  1129. while Length(Value) >= n do
  1130. begin
  1131. c := Value[n];
  1132. Inc(n);
  1133. if c = '-' then
  1134. Break;
  1135. if (c = '=') or (Pos(c, table) < 1) then
  1136. begin
  1137. Dec(n);
  1138. Break;
  1139. end;
  1140. s := s + c;
  1141. end;
  1142. if s = '' then
  1143. s := WriteMulti(Ord(shift), 0, 0, 0, 2, false)
  1144. else
  1145. begin
  1146. if modified then
  1147. t := DecodeBase64mod(s)
  1148. else
  1149. t := DecodeBase64(s);
  1150. if not odd(length(t)) then
  1151. s := t
  1152. else
  1153. begin //ill-formed sequence
  1154. t := s;
  1155. s := WriteMulti(Ord(shift), 0, 0, 0, 2, false);
  1156. for i := 1 to length(t) do
  1157. s := s + WriteMulti(Ord(t[i]), 0, 0, 0, 2, false);
  1158. end;
  1159. end;
  1160. Result := Result + s;
  1161. end;
  1162. end;
  1163. end;
  1164. {==============================================================================}
  1165. function UCS2toUTF7(const Value: AnsiString; Modified: Boolean): AnsiString;
  1166. var
  1167. s: AnsiString;
  1168. b1, b2, b3, b4: Byte;
  1169. n, m: Integer;
  1170. shift: AnsiChar;
  1171. begin
  1172. Result := '';
  1173. n := 1;
  1174. if modified then
  1175. shift := '&'
  1176. else
  1177. shift := '+';
  1178. while Length(Value) >= n do
  1179. begin
  1180. ReadMulti(Value, n, 2, b1, b2, b3, b4, false);
  1181. if (b2 = 0) and (b1 < 128) then
  1182. if AnsiChar(b1) = shift then
  1183. Result := Result + shift + '-'
  1184. else
  1185. Result := Result + AnsiChar(b1)
  1186. else
  1187. begin
  1188. s := AnsiChar(b2) + AnsiChar(b1);
  1189. while Length(Value) >= n do
  1190. begin
  1191. ReadMulti(Value, n, 2, b1, b2, b3, b4, false);
  1192. if (b2 = 0) and (b1 < 128) then
  1193. begin
  1194. Dec(n, 2);
  1195. Break;
  1196. end;
  1197. s := s + AnsiChar(b2) + AnsiChar(b1);
  1198. end;
  1199. if modified then
  1200. s := EncodeBase64mod(s)
  1201. else
  1202. s := EncodeBase64(s);
  1203. m := Pos('=', s);
  1204. if m > 0 then
  1205. s := Copy(s, 1, m - 1);
  1206. Result := Result + shift + s + '-';
  1207. end;
  1208. end;
  1209. end;
  1210. {==============================================================================}
  1211. function CharsetConversion(const Value: AnsiString; CharFrom: TMimeChar;
  1212. CharTo: TMimeChar): AnsiString;
  1213. begin
  1214. Result := CharsetConversionEx(Value, CharFrom, CharTo, Replace_None);
  1215. end;
  1216. {==============================================================================}
  1217. function CharsetConversionEx(const Value: AnsiString; CharFrom: TMimeChar;
  1218. CharTo: TMimeChar; const TransformTable: array of Word): AnsiString;
  1219. begin
  1220. Result := CharsetConversionTrans(Value, CharFrom, CharTo, TransformTable, True);
  1221. end;
  1222. {==============================================================================}
  1223. function InternalToUcs(const Value: AnsiString; Charfrom: TMimeChar): AnsiString;
  1224. var
  1225. uni: Word;
  1226. n: Integer;
  1227. b1, b2, b3, b4: Byte;
  1228. SourceTable: array[128..255] of Word;
  1229. mbf: Byte;
  1230. lef: Boolean;
  1231. s: AnsiString;
  1232. begin
  1233. if CharFrom = UTF_8 then
  1234. s := UTF8toUCS4(Value)
  1235. else
  1236. if CharFrom = UTF_7 then
  1237. s := UTF7toUCS2(Value, False)
  1238. else
  1239. if CharFrom = UTF_7mod then
  1240. s := UTF7toUCS2(Value, True)
  1241. else
  1242. s := Value;
  1243. GetArray(CharFrom, SourceTable);
  1244. mbf := 1;
  1245. if CharFrom in SetTwo then
  1246. mbf := 2;
  1247. if CharFrom in SetFour then
  1248. mbf := 4;
  1249. lef := CharFrom in SetLe;
  1250. Result := '';
  1251. n := 1;
  1252. while Length(s) >= n do
  1253. begin
  1254. ReadMulti(s, n, mbf, b1, b2, b3, b4, lef);
  1255. //handle BOM
  1256. if (b3 = 0) and (b4 = 0) then
  1257. begin
  1258. if (b1 = $FE) and (b2 = $FF) then
  1259. begin
  1260. lef := not lef;
  1261. continue;
  1262. end;
  1263. if (b1 = $FF) and (b2 = $FE) then
  1264. continue;
  1265. end;
  1266. if mbf = 1 then
  1267. if b1 > 127 then
  1268. begin
  1269. uni := SourceTable[b1];
  1270. b1 := Lo(uni);
  1271. b2 := Hi(uni);
  1272. end;
  1273. Result := Result + WriteMulti(b1, b2, b3, b4, 2, False);
  1274. end;
  1275. end;
  1276. function CharsetConversionTrans(Value: AnsiString; CharFrom: TMimeChar;
  1277. CharTo: TMimeChar; const TransformTable: array of Word; Translit: Boolean): AnsiString;
  1278. var
  1279. uni: Word;
  1280. n, m: Integer;
  1281. b: Byte;
  1282. b1, b2, b3, b4: Byte;
  1283. TargetTable: array[128..255] of Word;
  1284. mbt: Byte;
  1285. let: Boolean;
  1286. ucsstring, s, t: AnsiString;
  1287. cd: iconv_t;
  1288. f: Boolean;
  1289. NotNeedTransform: Boolean;
  1290. FromID, ToID: string;
  1291. begin
  1292. NotNeedTransform := (High(TransformTable) = 0);
  1293. if (CharFrom = CharTo) and NotNeedTransform then
  1294. begin
  1295. Result := Value;
  1296. Exit;
  1297. end;
  1298. FromID := GetIDFromCP(CharFrom);
  1299. ToID := GetIDFromCP(CharTo);
  1300. cd := Iconv_t(-1);
  1301. //do two-pass conversion. Transform to UCS-2 first.
  1302. if not DisableIconv then
  1303. cd := SynaIconvOpenIgnore('UCS-2BE', FromID);
  1304. try
  1305. if cd <> iconv_t(-1) then
  1306. SynaIconv(cd, Value, ucsstring)
  1307. else
  1308. ucsstring := InternalToUcs(Value, CharFrom);
  1309. finally
  1310. SynaIconvClose(cd);
  1311. end;
  1312. //here we allways have ucstring with UCS-2 encoding
  1313. //second pass... from UCS-2 to target encoding.
  1314. if not DisableIconv then
  1315. if translit then
  1316. cd := SynaIconvOpenTranslit(ToID, 'UCS-2BE')
  1317. else
  1318. cd := SynaIconvOpenIgnore(ToID, 'UCS-2BE');
  1319. try
  1320. if (cd <> iconv_t(-1)) and NotNeedTransform then
  1321. begin
  1322. if CharTo = UTF_7 then
  1323. ucsstring := ucsstring + #0 + '-';
  1324. //when transformtable is not needed and Iconv know target charset,
  1325. //do it fast by one call.
  1326. SynaIconv(cd, ucsstring, Result);
  1327. if CharTo = UTF_7 then
  1328. Delete(Result, Length(Result), 1);
  1329. end
  1330. else
  1331. begin
  1332. GetArray(CharTo, TargetTable);
  1333. mbt := 1;
  1334. if CharTo in SetTwo then
  1335. mbt := 2;
  1336. if CharTo in SetFour then
  1337. mbt := 4;
  1338. let := CharTo in SetLe;
  1339. b3 := 0;
  1340. b4 := 0;
  1341. Result := '';
  1342. for n:= 0 to (Length(ucsstring) div 2) - 1 do
  1343. begin
  1344. s := Copy(ucsstring, n * 2 + 1, 2);
  1345. b2 := Ord(s[1]);
  1346. b1 := Ord(s[2]);
  1347. uni := b2 * 256 + b1;
  1348. if not NotNeedTransform then
  1349. begin
  1350. uni := ReplaceUnicode(uni, TransformTable);
  1351. b1 := Lo(uni);
  1352. b2 := Hi(uni);
  1353. s[1] := AnsiChar(b2);
  1354. s[2] := AnsiChar(b1);
  1355. end;
  1356. if cd <> iconv_t(-1) then
  1357. begin
  1358. if CharTo = UTF_7 then
  1359. s := s + #0 + '-';
  1360. SynaIconv(cd, s, t);
  1361. if CharTo = UTF_7 then
  1362. Delete(t, Length(t), 1);
  1363. Result := Result + t;
  1364. end
  1365. else
  1366. begin
  1367. f := True;
  1368. if mbt = 1 then
  1369. if uni > 127 then
  1370. begin
  1371. f := False;
  1372. b := 0;
  1373. for m := 128 to 255 do
  1374. if TargetTable[m] = uni then
  1375. begin
  1376. b := m;
  1377. f := True;
  1378. Break;
  1379. end;
  1380. b1 := b;
  1381. b2 := 0;
  1382. end
  1383. else
  1384. b1 := Lo(uni);
  1385. if not f then
  1386. if translit then
  1387. begin
  1388. b1 := Ord(NotFoundChar);
  1389. b2 := 0;
  1390. f := True;
  1391. end;
  1392. if f then
  1393. Result := Result + WriteMulti(b1, b2, b3, b4, mbt, let)
  1394. end;
  1395. end;
  1396. if cd = iconv_t(-1) then
  1397. begin
  1398. if CharTo = UTF_7 then
  1399. Result := UCS2toUTF7(Result, false);
  1400. if CharTo = UTF_7mod then
  1401. Result := UCS2toUTF7(Result, true);
  1402. if CharTo = UTF_8 then
  1403. Result := UCS4toUTF8(Result);
  1404. end;
  1405. end;
  1406. finally
  1407. SynaIconvClose(cd);
  1408. end;
  1409. end;
  1410. {==============================================================================}
  1411. {$IFNDEF WIN32}
  1412. function GetCurCP: TMimeChar;
  1413. begin
  1414. {$IFNDEF FPC}
  1415. Result := GetCPFromID(nl_langinfo(_NL_CTYPE_CODESET_NAME));
  1416. {$ELSE}
  1417. {$IFDEF FPC_USE_LIBC}
  1418. Result := GetCPFromID(nl_langinfo(_NL_CTYPE_CODESET_NAME));
  1419. {$ELSE}
  1420. //How to get system codepage without LIBC?
  1421. Result := UTF_8;
  1422. {$ENDIF}
  1423. {$ENDIF}
  1424. end;
  1425. function GetCurOEMCP: TMimeChar;
  1426. begin
  1427. Result := GetCurCP;
  1428. end;
  1429. {$ELSE}
  1430. function CPToMimeChar(Value: Integer): TMimeChar;
  1431. begin
  1432. case Value of
  1433. 437, 850, 20127:
  1434. Result := ISO_8859_1; //I know, it is not ideal!
  1435. 737:
  1436. Result := CP737;
  1437. 775:
  1438. Result := CP775;
  1439. 852:
  1440. Result := CP852;
  1441. 855:
  1442. Result := CP855;
  1443. 857:
  1444. Result := CP857;
  1445. 858:
  1446. Result := CP858;
  1447. 860:
  1448. Result := CP860;
  1449. 861:
  1450. Result := CP861;
  1451. 862:
  1452. Result := CP862;
  1453. 863:
  1454. Result := CP863;
  1455. 864:
  1456. Result := CP864;
  1457. 865:
  1458. Result := CP865;
  1459. 866:
  1460. Result := CP866;
  1461. 869:
  1462. Result := CP869;
  1463. 874:
  1464. Result := ISO_8859_15;
  1465. 895:
  1466. Result := CP895;
  1467. 932:
  1468. Result := CP932;
  1469. 936:
  1470. Result := CP936;
  1471. 949:
  1472. Result := CP949;
  1473. 950:
  1474. Result := CP950;
  1475. 1200:
  1476. Result := UCS_2LE;
  1477. 1201:
  1478. Result := UCS_2;
  1479. 1250:
  1480. Result := CP1250;
  1481. 1251:
  1482. Result := CP1251;
  1483. 1253:
  1484. Result := CP1253;
  1485. 1254:
  1486. Result := CP1254;
  1487. 1255:
  1488. Result := CP1255;
  1489. 1256:
  1490. Result := CP1256;
  1491. 1257:
  1492. Result := CP1257;
  1493. 1258:
  1494. Result := CP1258;
  1495. 1361:
  1496. Result := CP1361;
  1497. 10000:
  1498. Result := MAC;
  1499. 10004:
  1500. Result := MACAR;
  1501. 10005:
  1502. Result := MACHEB;
  1503. 10006:
  1504. Result := MACGR;
  1505. 10007:
  1506. Result := MACCYR;
  1507. 10010:
  1508. Result := MACRO;
  1509. 10017:
  1510. Result := MACUK;
  1511. 10021:
  1512. Result := MACTH;
  1513. 10029:
  1514. Result := MACCE;
  1515. 10079:
  1516. Result := MACICE;
  1517. 10081:
  1518. Result := MACTU;
  1519. 10082:
  1520. Result := MACCRO;
  1521. 12000:
  1522. Result := UCS_4LE;
  1523. 12001:
  1524. Result := UCS_4;
  1525. 20866:
  1526. Result := KOI8_R;
  1527. 20932:
  1528. Result := JIS_X0208;
  1529. 20936:
  1530. Result := GB2312;
  1531. 21866:
  1532. Result := KOI8_U;
  1533. 28591:
  1534. Result := ISO_8859_1;
  1535. 28592:
  1536. Result := ISO_8859_2;
  1537. 28593:
  1538. Result := ISO_8859_3;
  1539. 28594:
  1540. Result := ISO_8859_4;
  1541. 28595:
  1542. Result := ISO_8859_5;
  1543. 28596, 708:
  1544. Result := ISO_8859_6;
  1545. 28597:
  1546. Result := ISO_8859_7;
  1547. 28598, 38598:
  1548. Result := ISO_8859_8;
  1549. 28599:
  1550. Result := ISO_8859_9;
  1551. 28605:
  1552. Result := ISO_8859_15;
  1553. 50220:
  1554. Result := ISO_2022_JP; //? ISO 2022 Japanese with no halfwidth Katakana
  1555. 50221:
  1556. Result := ISO_2022_JP1;//? Japanese with halfwidth Katakana
  1557. 50222:
  1558. Result := ISO_2022_JP2;//? Japanese JIS X 0201-1989
  1559. 50225:
  1560. Result := ISO_2022_KR;
  1561. 50227:
  1562. Result := ISO_2022_CN;//? ISO 2022 Simplified Chinese
  1563. 50229:
  1564. Result := ISO_2022_CNE;//? ISO 2022 Traditional Chinese
  1565. 51932:
  1566. Result := EUC_JP;
  1567. 51936:
  1568. Result := GB2312;
  1569. 51949:
  1570. Result := EUC_KR;
  1571. 52936:
  1572. Result := HZ;
  1573. 54936:
  1574. Result := GB18030;
  1575. 65000:
  1576. Result := UTF_7;
  1577. 65001:
  1578. Result := UTF_8;
  1579. 0:
  1580. Result := UCS_2LE;
  1581. else
  1582. Result := CP1252;
  1583. end;
  1584. end;
  1585. function GetCurCP: TMimeChar;
  1586. begin
  1587. Result := CPToMimeChar(GetACP);
  1588. end;
  1589. function GetCurOEMCP: TMimeChar;
  1590. begin
  1591. Result := CPToMimeChar(GetOEMCP);
  1592. end;
  1593. {$ENDIF}
  1594. {==============================================================================}
  1595. function NeedCharsetConversion(const Value: AnsiString): Boolean;
  1596. var
  1597. n: Integer;
  1598. begin
  1599. Result := False;
  1600. for n := 1 to Length(Value) do
  1601. if (Ord(Value[n]) > 127) or (Ord(Value[n]) = 0) then
  1602. begin
  1603. Result := True;
  1604. Break;
  1605. end;
  1606. end;
  1607. {==============================================================================}
  1608. function IdealCharsetCoding(const Value: AnsiString; CharFrom: TMimeChar;
  1609. CharTo: TMimeSetChar): TMimeChar;
  1610. var
  1611. n: Integer;
  1612. max: Integer;
  1613. s, t, u: AnsiString;
  1614. CharSet: TMimeChar;
  1615. begin
  1616. Result := ISO_8859_1;
  1617. s := Copy(Value, 1, 1024); //max first 1KB for next procedure
  1618. max := 0;
  1619. for n := Ord(Low(TMimeChar)) to Ord(High(TMimeChar)) do
  1620. begin
  1621. CharSet := TMimeChar(n);
  1622. if CharSet in CharTo then
  1623. begin
  1624. t := CharsetConversionTrans(s, CharFrom, CharSet, Replace_None, False);
  1625. u := CharsetConversionTrans(t, CharSet, CharFrom, Replace_None, False);
  1626. if s = u then
  1627. begin
  1628. Result := CharSet;
  1629. Exit;
  1630. end;
  1631. if Length(u) > max then
  1632. begin
  1633. Result := CharSet;
  1634. max := Length(u);
  1635. end;
  1636. end;
  1637. end;
  1638. end;
  1639. {==============================================================================}
  1640. function GetBOM(Value: TMimeChar): AnsiString;
  1641. begin
  1642. Result := '';
  1643. case Value of
  1644. UCS_2:
  1645. Result := #$fe + #$ff;
  1646. UCS_4:
  1647. Result := #$00 + #$00 + #$fe + #$ff;
  1648. UCS_2LE:
  1649. Result := #$ff + #$fe;
  1650. UCS_4LE:
  1651. Result := #$ff + #$fe + #$00 + #$00;
  1652. UTF_8:
  1653. Result := #$ef + #$bb + #$bf;
  1654. end;
  1655. end;
  1656. {==============================================================================}
  1657. function GetCPFromID(Value: AnsiString): TMimeChar;
  1658. begin
  1659. Value := UpperCase(Value);
  1660. if (Pos('KAMENICKY', Value) > 0) or (Pos('895', Value) > 0) then
  1661. Result := CP895
  1662. else
  1663. if Pos('MUTF-7', Value) > 0 then
  1664. Result := UTF_7mod
  1665. else
  1666. Result := GetCPFromIconvID(Value);
  1667. end;
  1668. {==============================================================================}
  1669. function GetIDFromCP(Value: TMimeChar): AnsiString;
  1670. begin
  1671. case Value of
  1672. CP895:
  1673. Result := 'CP-895';
  1674. UTF_7mod:
  1675. Result := 'mUTF-7';
  1676. else
  1677. Result := GetIconvIDFromCP(Value);
  1678. end;
  1679. end;
  1680. {==============================================================================}
  1681. function StringToWide(const Value: AnsiString): WideString;
  1682. var
  1683. n: integer;
  1684. x, y: integer;
  1685. begin
  1686. SetLength(Result, Length(Value) div 2);
  1687. for n := 1 to Length(Value) div 2 do
  1688. begin
  1689. x := Ord(Value[((n-1) * 2) + 1]);
  1690. y := Ord(Value[((n-1) * 2) + 2]);
  1691. Result[n] := WideChar(x * 256 + y);
  1692. end;
  1693. end;
  1694. {==============================================================================}
  1695. function WideToString(const Value: WideString): AnsiString;
  1696. var
  1697. n: integer;
  1698. x: integer;
  1699. begin
  1700. SetLength(Result, Length(Value) * 2);
  1701. for n := 1 to Length(Value) do
  1702. begin
  1703. x := Ord(Value[n]);
  1704. Result[((n-1) * 2) + 1] := AnsiChar(x div 256);
  1705. Result[((n-1) * 2) + 2] := AnsiChar(x mod 256);
  1706. end;
  1707. end;
  1708. {==============================================================================}
  1709. initialization
  1710. begin
  1711. IconvArr[0].Charset := ISO_8859_1;
  1712. IconvArr[0].Charname := 'ISO-8859-1 CP819 IBM819 ISO-IR-100 ISO8859-1 ISO_8859-1 ISO_8859-1:1987 L1 LATIN1 CSISOLATIN1';
  1713. IconvArr[1].Charset := UTF_8;
  1714. IconvArr[1].Charname := 'UTF-8';
  1715. IconvArr[2].Charset := UCS_2;
  1716. IconvArr[2].Charname := 'ISO-10646-UCS-2 UCS-2 CSUNICODE';
  1717. IconvArr[3].Charset := UCS_2;
  1718. IconvArr[3].Charname := 'UCS-2BE UNICODE-1-1 UNICODEBIG CSUNICODE11';
  1719. IconvArr[4].Charset := UCS_2LE;
  1720. IconvArr[4].Charname := 'UCS-2LE UNICODELITTLE';
  1721. IconvArr[5].Charset := UCS_4;
  1722. IconvArr[5].Charname := 'ISO-10646-UCS-4 UCS-4 CSUCS4';
  1723. IconvArr[6].Charset := UCS_4;
  1724. IconvArr[6].Charname := 'UCS-4BE';
  1725. IconvArr[7].Charset := UCS_2LE;
  1726. IconvArr[7].Charname := 'UCS-4LE';
  1727. IconvArr[8].Charset := UTF_16;
  1728. IconvArr[8].Charname := 'UTF-16';
  1729. IconvArr[9].Charset := UTF_16;
  1730. IconvArr[9].Charname := 'UTF-16BE';
  1731. IconvArr[10].Charset := UTF_16LE;
  1732. IconvArr[10].Charname := 'UTF-16LE';
  1733. IconvArr[11].Charset := UTF_32;
  1734. IconvArr[11].Charname := 'UTF-32';
  1735. IconvArr[12].Charset := UTF_32;
  1736. IconvArr[12].Charname := 'UTF-32BE';
  1737. IconvArr[13].Charset := UTF_32;
  1738. IconvArr[13].Charname := 'UTF-32LE';
  1739. IconvArr[14].Charset := UTF_7;
  1740. IconvArr[14].Charname := 'UNICODE-1-1-UTF-7 UTF-7 CSUNICODE11UTF7';
  1741. IconvArr[15].Charset := C99;
  1742. IconvArr[15].Charname := 'C99';
  1743. IconvArr[16].Charset := JAVA;
  1744. IconvArr[16].Charname := 'JAVA';
  1745. IconvArr[17].Charset := ISO_8859_1;
  1746. IconvArr[17].Charname := 'US-ASCII ANSI_X3.4-1968 ANSI_X3.4-1986 ASCII CP367 IBM367 ISO-IR-6 ISO646-US ISO_646.IRV:1991 US CSASCII';
  1747. IconvArr[18].Charset := ISO_8859_2;
  1748. IconvArr[18].Charname := 'ISO-8859-2 ISO-IR-101 ISO8859-2 ISO_8859-2 ISO_8859-2:1987 L2 LATIN2 CSISOLATIN2';
  1749. IconvArr[19].Charset := ISO_8859_3;
  1750. IconvArr[19].Charname := 'ISO-8859-3 ISO-IR-109 ISO8859-3 ISO_8859-3 ISO_8859-3:1988 L3 LATIN3 CSISOLATIN3';
  1751. IconvArr[20].Charset := ISO_8859_4;
  1752. IconvArr[20].Charname := 'ISO-8859-4 ISO-IR-110 ISO8859-4 ISO_8859-4 ISO_8859-4:1988 L4 LATIN4 CSISOLATIN4';
  1753. IconvArr[21].Charset := ISO_8859_5;
  1754. IconvArr[21].Charname := 'ISO-8859-5 CYRILLIC ISO-IR-144 ISO8859-5 ISO_8859-5 ISO_8859-5:1988 CSISOLATINCYRILLIC';
  1755. IconvArr[22].Charset := ISO_8859_6;
  1756. IconvArr[22].Charname := 'ISO-8859-6 ARABIC ASMO-708 ECMA-114 ISO-IR-127 ISO8859-6 ISO_8859-6 ISO_8859-6:1987 CSISOLATINARABIC';
  1757. IconvArr[23].Charset := ISO_8859_7;
  1758. IconvArr[23].Charname := 'ISO-8859-7 ECMA-118 ELOT_928 GREEK GREEK8 ISO-IR-126 ISO8859-7 ISO_8859-7 ISO_8859-7:1987 CSISOLATINGREEK';
  1759. IconvArr[24].Charset := ISO_8859_8;
  1760. IconvArr[24].Charname := 'ISO-8859-8 HEBREW ISO_8859-8 ISO-IR-138 ISO8859-8 ISO_8859-8:1988 CSISOLATINHEBREW ISO-8859-8-I';
  1761. IconvArr[25].Charset := ISO_8859_9;
  1762. IconvArr[25].Charname := 'ISO-8859-9 ISO-IR-148 ISO8859-9 ISO_8859-9 ISO_8859-9:1989 L5 LATIN5 CSISOLATIN5';
  1763. IconvArr[26].Charset := ISO_8859_10;
  1764. IconvArr[26].Charname := 'ISO-8859-10 ISO-IR-157 ISO8859-10 ISO_8859-10 ISO_8859-10:1992 L6 LATIN6 CSISOLATIN6';
  1765. IconvArr[27].Charset := ISO_8859_13;
  1766. IconvArr[27].Charname := 'ISO-8859-13 ISO-IR-179 ISO8859-13 ISO_8859-13 L7 LATIN7';
  1767. IconvArr[28].Charset := ISO_8859_14;
  1768. IconvArr[28].Charname := 'ISO-8859-14 ISO-CELTIC ISO-IR-199 ISO8859-14 ISO_8859-14 ISO_8859-14:1998 L8 LATIN8';
  1769. IconvArr[29].Charset := ISO_8859_15;
  1770. IconvArr[29].Charname := 'ISO-8859-15 ISO-IR-203 ISO8859-15 ISO_8859-15 ISO_8859-15:1998';
  1771. IconvArr[30].Charset := ISO_8859_16;
  1772. IconvArr[30].Charname := 'ISO-8859-16 ISO-IR-226 ISO8859-16 ISO_8859-16 ISO_8859-16:2000';
  1773. IconvArr[31].Charset := KOI8_R;
  1774. IconvArr[31].Charname := 'KOI8-R CSKOI8R';
  1775. IconvArr[32].Charset := KOI8_U;
  1776. IconvArr[32].Charname := 'KOI8-U';
  1777. IconvArr[33].Charset := KOI8_RU;
  1778. IconvArr[33].Charname := 'KOI8-RU';
  1779. IconvArr[34].Charset := CP1250;
  1780. IconvArr[34].Charname := 'WINDOWS-1250 CP1250 MS-EE';
  1781. IconvArr[35].Charset := CP1251;
  1782. IconvArr[35].Charname := 'WINDOWS-1251 CP1251 MS-CYRL';
  1783. IconvArr[36].Charset := CP1252;
  1784. IconvArr[36].Charname := 'WINDOWS-1252 CP1252 MS-ANSI';
  1785. IconvArr[37].Charset := CP1253;
  1786. IconvArr[37].Charname := 'WINDOWS-1253 CP1253 MS-GREEK';
  1787. IconvArr[38].Charset := CP1254;
  1788. IconvArr[38].Charname := 'WINDOWS-1254 CP1254 MS-TURK';
  1789. IconvArr[39].Charset := CP1255;
  1790. IconvArr[39].Charname := 'WINDOWS-1255 CP1255 MS-HEBR';
  1791. IconvArr[40].Charset := CP1256;
  1792. IconvArr[40].Charname := 'WINDOWS-1256 CP1256 MS-ARAB';
  1793. IconvArr[41].Charset := CP1257;
  1794. IconvArr[41].Charname := 'WINDOWS-1257 CP1257 WINBALTRIM';
  1795. IconvArr[42].Charset := CP1258;
  1796. IconvArr[42].Charname := 'WINDOWS-1258 CP1258';
  1797. IconvArr[43].Charset := ISO_8859_1;
  1798. IconvArr[43].Charname := '850 CP850 IBM850 CSPC850MULTILINGUAL';
  1799. IconvArr[44].Charset := CP862;
  1800. IconvArr[44].Charname := '862 CP862 IBM862 CSPC862LATINHEBREW';
  1801. IconvArr[45].Charset := CP866;
  1802. IconvArr[45].Charname := '866 CP866 IBM866 CSIBM866';
  1803. IconvArr[46].Charset := MAC;
  1804. IconvArr[46].Charname := 'MAC MACINTOSH MACROMAN CSMACINTOSH';
  1805. IconvArr[47].Charset := MACCE;
  1806. IconvArr[47].Charname := 'MACCENTRALEUROPE';
  1807. IconvArr[48].Charset := MACICE;
  1808. IconvArr[48].Charname := 'MACICELAND';
  1809. IconvArr[49].Charset := MACCRO;
  1810. IconvArr[49].Charname := 'MACCROATIAN';
  1811. IconvArr[50].Charset := MACRO;
  1812. IconvArr[50].Charname := 'MACROMANIA';
  1813. IconvArr[51].Charset := MACCYR;
  1814. IconvArr[51].Charname := 'MACCYRILLIC';
  1815. IconvArr[52].Charset := MACUK;
  1816. IconvArr[52].Charname := 'MACUKRAINE';
  1817. IconvArr[53].Charset := MACGR;
  1818. IconvArr[53].Charname := 'MACGREEK';
  1819. IconvArr[54].Charset := MACTU;
  1820. IconvArr[54].Charname := 'MACTURKISH';
  1821. IconvArr[55].Charset := MACHEB;
  1822. IconvArr[55].Charname := 'MACHEBREW';
  1823. IconvArr[56].Charset := MACAR;
  1824. IconvArr[56].Charname := 'MACARABIC';
  1825. IconvArr[57].Charset := MACTH;
  1826. IconvArr[57].Charname := 'MACTHAI';
  1827. IconvArr[58].Charset := ROMAN8;
  1828. IconvArr[58].Charname := 'HP-ROMAN8 R8 ROMAN8 CSHPROMAN8';
  1829. IconvArr[59].Charset := NEXTSTEP;
  1830. IconvArr[59].Charname := 'NEXTSTEP';
  1831. IconvArr[60].Charset := ARMASCII;
  1832. IconvArr[60].Charname := 'ARMSCII-8';
  1833. IconvArr[61].Charset := GEORGIAN_AC;
  1834. IconvArr[61].Charname := 'GEORGIAN-ACADEMY';
  1835. IconvArr[62].Charset := GEORGIAN_PS;
  1836. IconvArr[62].Charname := 'GEORGIAN-PS';
  1837. IconvArr[63].Charset := KOI8_T;
  1838. IconvArr[63].Charname := 'KOI8-T';
  1839. IconvArr[64].Charset := MULELAO;
  1840. IconvArr[64].Charname := 'MULELAO-1';
  1841. IconvArr[65].Charset := CP1133;
  1842. IconvArr[65].Charname := 'CP1133 IBM-CP1133';
  1843. IconvArr[66].Charset := TIS620;
  1844. IconvArr[66].Charname := 'TIS-620 ISO-IR-166 TIS620 TIS620-0 TIS620.2529-1 TIS620.2533-0 TIS620.2533-1';
  1845. IconvArr[67].Charset := CP874;
  1846. IconvArr[67].Charname := 'CP874 WINDOWS-874';
  1847. IconvArr[68].Charset := VISCII;
  1848. IconvArr[68].Charname := 'VISCII VISCII1.1-1 CSVISCII';
  1849. IconvArr[69].Charset := TCVN;
  1850. IconvArr[69].Charname := 'TCVN TCVN-5712 TCVN5712-1 TCVN5712-1:1993';
  1851. IconvArr[70].Charset := ISO_IR_14;
  1852. IconvArr[70].Charname := 'ISO-IR-14 ISO646-JP JIS_C6220-1969-RO JP CSISO14JISC6220RO';
  1853. IconvArr[71].Charset := JIS_X0201;
  1854. IconvArr[71].Charname := 'JISX0201-1976 JIS_X0201 X0201 CSHALFWIDTHKATAKANA';
  1855. IconvArr[72].Charset := JIS_X0208;
  1856. IconvArr[72].Charname := 'ISO-IR-87 JIS0208 JIS_C6226-1983 JIS_X0208 JIS_X0208-1983 JIS_X0208-1990 X0208 CSISO87JISX0208';
  1857. IconvArr[73].Charset := JIS_X0212;
  1858. IconvArr[73].Charname := 'ISO-IR-159 JIS_X0212 JIS_X0212-1990 JIS_X0212.1990-0 X0212 CSISO159JISX02121990';
  1859. IconvArr[74].Charset := GB1988_80;
  1860. IconvArr[74].Charname := 'CN GB_1988-80 ISO-IR-57 ISO646-CN CSISO57GB1988';
  1861. IconvArr[75].Charset := GB2312_80;
  1862. IconvArr[75].Charname := 'CHINESE GB_2312-80 ISO-IR-58 CSISO58GB231280';
  1863. IconvArr[76].Charset := ISO_IR_165;
  1864. IconvArr[76].Charname := 'CN-GB-ISOIR165 ISO-IR-165';
  1865. IconvArr[77].Charset := ISO_IR_149;
  1866. IconvArr[77].Charname := 'ISO-IR-149 KOREAN KSC_5601 KS_C_5601-1987 KS_C_5601-1989 CSKSC56011987';
  1867. IconvArr[78].Charset := EUC_JP;
  1868. IconvArr[78].Charname := 'EUC-JP EUCJP EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE CSEUCPKDFMTJAPANESE';
  1869. IconvArr[79].Charset := SHIFT_JIS;
  1870. IconvArr[79].Charname := 'SHIFT-JIS MS_KANJI SHIFT_JIS SJIS CSSHIFTJIS';
  1871. IconvArr[80].Charset := CP932;
  1872. IconvArr[80].Charname := 'CP932';
  1873. IconvArr[81].Charset := ISO_2022_JP;
  1874. IconvArr[81].Charname := 'ISO-2022-JP CSISO2022JP';
  1875. IconvArr[82].Charset := ISO_2022_JP1;
  1876. IconvArr[82].Charname := 'ISO-2022-JP-1';
  1877. IconvArr[83].Charset := ISO_2022_JP2;
  1878. IconvArr[83].Charname := 'ISO-2022-JP-2 CSISO2022JP2';
  1879. IconvArr[84].Charset := GB2312;
  1880. IconvArr[84].Charname := 'CN-GB EUC-CN EUCCN GB2312 CSGB2312';
  1881. IconvArr[85].Charset := CP936;
  1882. IconvArr[85].Charname := 'CP936 GBK';
  1883. IconvArr[86].Charset := GB18030;
  1884. IconvArr[86].Charname := 'GB18030';
  1885. IconvArr[87].Charset := ISO_2022_CN;
  1886. IconvArr[87].Charname := 'ISO-2022-CN CSISO2022CN';
  1887. IconvArr[88].Charset := ISO_2022_CNE;
  1888. IconvArr[88].Charname := 'ISO-2022-CN-EXT';
  1889. IconvArr[89].Charset := HZ;
  1890. IconvArr[89].Charname := 'HZ HZ-GB-2312';
  1891. IconvArr[90].Charset := EUC_TW;
  1892. IconvArr[90].Charname := 'EUC-TW EUCTW CSEUCTW';
  1893. IconvArr[91].Charset := BIG5;
  1894. IconvArr[91].Charname := 'BIG5 BIG-5 BIG-FIVE BIGFIVE CN-BIG5 CSBIG5';
  1895. IconvArr[92].Charset := CP950;
  1896. IconvArr[92].Charname := 'CP950';
  1897. IconvArr[93].Charset := BIG5_HKSCS;
  1898. IconvArr[93].Charname := 'BIG5-HKSCS BIG5HKSCS';
  1899. IconvArr[94].Charset := EUC_KR;
  1900. IconvArr[94].Charname := 'EUC-KR EUCKR CSEUCKR';
  1901. IconvArr[95].Charset := CP949;
  1902. IconvArr[95].Charname := 'CP949 UHC';
  1903. IconvArr[96].Charset := CP1361;
  1904. IconvArr[96].Charname := 'CP1361 JOHAB';
  1905. IconvArr[97].Charset := ISO_2022_KR;
  1906. IconvArr[97].Charname := 'ISO-2022-KR CSISO2022KR';
  1907. IconvArr[98].Charset := ISO_8859_1;
  1908. IconvArr[98].Charname := '437 CP437 IBM437 CSPC8CODEPAGE437';
  1909. IconvArr[99].Charset := CP737;
  1910. IconvArr[99].Charname := 'CP737';
  1911. IconvArr[100].Charset := CP775;
  1912. IconvArr[100].Charname := 'CP775 IBM775 CSPC775BALTIC';
  1913. IconvArr[101].Charset := CP852;
  1914. IconvArr[101].Charname := '852 CP852 IBM852 CSPCP852';
  1915. IconvArr[102].Charset := CP853;
  1916. IconvArr[102].Charname := 'CP853';
  1917. IconvArr[103].Charset := CP855;
  1918. IconvArr[103].Charname := '855 CP855 IBM855 CSIBM855';
  1919. IconvArr[104].Charset := CP857;
  1920. IconvArr[104].Charname := '857 CP857 IBM857 CSIBM857';
  1921. IconvArr[105].Charset := CP858;
  1922. IconvArr[105].Charname := 'CP858';
  1923. IconvArr[106].Charset := CP860;
  1924. IconvArr[106].Charname := '860 CP860 IBM860 CSIBM860';
  1925. IconvArr[107].Charset := CP861;
  1926. IconvArr[107].Charname := '861 CP-IS CP861 IBM861 CSIBM861';
  1927. IconvArr[108].Charset := CP863;
  1928. IconvArr[108].Charname := '863 CP863 IBM863 CSIBM863';
  1929. IconvArr[109].Charset := CP864;
  1930. IconvArr[109].Charname := 'CP864 IBM864 CSIBM864';
  1931. IconvArr[110].Charset := CP865;
  1932. IconvArr[110].Charname := '865 CP865 IBM865 CSIBM865';
  1933. IconvArr[111].Charset := CP869;
  1934. IconvArr[111].Charname := '869 CP-GR CP869 IBM869 CSIBM869';
  1935. IconvArr[112].Charset := CP1125;
  1936. IconvArr[112].Charname := 'CP1125';
  1937. end;
  1938. end.