From: Andras Kornai <andras@calera.com> Subject: Re: One more kermit question To: fdc@watsun.cc.columbia.edu (Frank da Cruz) Date: Thu, 11 Mar 93 21:33:45 PST ---------------------------------------------------------------------- CYRILLIC ENCODING FAQ Version 1.3, March 13 1993 ACKNOWLEDGEMENTS Most of the information was provided by the following: David J. Birnbaum <djbpitt+@pitt.edu> Frank da Cruz <fdc@watsun.cc.columbia.edu> Bur Davis <bdavis@adobe.com> George Fowler <gfowler@ucs.indiana.edu> Richard B. Paine <RPAINE@CCNODE.Colorado.EDU> Slava Paperno <PAPY@CORNELLA.cit.cornell.edu> Keld J. Simonsen <Keld.Simonsen@dkuug.dk> Glenn E. Thobe <thobe@getunx.info.com> Dimitri Vulis <DLV@CUNYVMS1.BITNET> Johan W. van Wingen <precal@rulmvs.leidenuniv.nl> Thanks to all who contributed -- I am responsible for the errors that still remain. Andras Kornai (andras@calera.com, kornai@csli.stanford.edu) Q: What are the commonly used computer encodings for Cyrillic? A: Broadly speaking, there are three kinds of schemes in use: those that replace Cyrillic characters by 7-bit ascii values, those that use the full 8-bit range 0-255, and those using multi-byte codes. Presently only the first two types are in wide use, but for reference purposes I will also discuss the third type. Q: What kind of transliteration schemes are there? A: The most important one is called KOI-7: the Russian alphabet is given by the ASCII characters (note the exchange of upper and lower cases): UPPER CASE: abwgde$vzijklmnoprstufhc~{}"yx|`q lower case: ABWGDE#VZIJKLMNOPRSTUFHC^[]_YX\@Q The following extensions to the official standard KOI-7 are supported in Glenn Thobe's conversion programs for invertibility: '"'=YER, '#'=yo, '$'=YO, '<'=left guillemet, '>'=right guillemet. A slightly different (multicharacter) scheme is employed by Steve Gaardner's (gaarder@theory.tc.cornell.edu) conversion code from Old KOI-8, included below. This particular scheme provides easy readability but suffers from some transliteration weirdness, such as mapping short ii and yeri on the same character. Since proper transliteration often requires context-sensitive rules, and differs from language to language within the same script, a fuller discussion is beyond the scope of the present document. For an overview of the major Cyrillic to Latin transliteration schemes used in the US, see pp 457-460 of the Style Manual of the US Government Printing Office, for sale by the Superintendent of Documents, USGPO, Washington DC 20402, Stock Number 021-000-00120-1 (paper) or 021-000-00120-0 (hardbound). See also the Chicago Manual of Style, and Transliteracija russkikh slov latinskimi bukvami, GOST 167876-71 #include <stdio.h> char transtbl[64][5] = {"yu", "a", "b", "ts", "d" , "e", "f", "g", "kh", "i", "y" , "k", "l", "m", "n", "o", "p", "ya", "r" , "s", "t", "u", "zh", "v", "'", "y", "z", "sh", "e", "shch", "ch", "`", "YU", "A", "B", "TS", "D" , "E", "F", "G", "KH", "I", "Y" , "K", "L", "M", "N", "O", "P", "YA", "R" , "S", "T", "U", "ZH", "V", "'", "Y", "Z", "SH", "E", "SHCH", "CH", "`" }; main() { int c; while ((c = getchar()) != EOF) { if ( c > 0x80) c -= 0x80; if ( c < 0x40) putchar(c); else printf("%s",transtbl[c-0x40]); } } Q: What are the eight-bit schemes? A: For the IBM mainframe world, which includes the ES (edinnaja sistema) clones of 360-370 mainframes, the basic scheme, called DKOI-8, extends EBCDIC by putting the Cyrillic letters in the unused slots, mostly in the rectangle 0x8a to 0xff (first hex digit >=8, second digit >=a). The mysteries of EBCDIC/ASCII conversion go beyond the scope of this document, and in the table that follows I will ignore 8-bit ascii values below 0xa0 and refer the reader to Dimitri Vulis' excellent document, which sheds some light on the IBM meaning of the characters 0x80-0x9f which are reserved in both IS0 8859-1 (Latin-1) and 8859-5 (Cyrillic). /* From 8859-5 to DKOI-8. ebcdic(isoval) = isotoibm[isoval-160] */ int isotoibm[96] = { 0x41,0xaa,0x4a,0xb1,0x9f,0xb2,0x6a,0xb5, 0xbd,0xb4,0x9a,0x8a,0x5f,0xca,0xaf,0xbc, 0x90,0x8f,0xea,0xfa,0xbe,0xa0,0xb6,0xb3, 0x9d,0xda,0x9b,0x8b,0xb7,0xb8,0xb9,0xab, 0x64,0x65,0x62,0x66,0x63,0x67,0x9e,0x68, 0x74,0x71,0x72,0x73,0x78,0x75,0x76,0x77, 0xac,0x69,0xed,0xee,0xeb,0xef,0xec,0xbf, 0x80,0xfd,0xfe,0xfb,0xfc,0xad,0xae,0x59, 0x44,0x45,0x42,0x46,0x43,0x47,0x9c,0x48, 0x54,0x51,0x52,0x53,0x58,0x55,0x56,0x57, 0x8c,0x49,0xcd,0xce,0xcb,0xcf,0xcc,0xe1, 0x70,0xdd,0xde,0xdb,0xdc,0x8d,0x8e,0xdf }; There are minor variations to DKOI, called Cyrillic Extended Code Page 037 (most common on BITNET), CECP 500 (which is the definitive one), the "JNET" and the "FORTRAN" mappings. The differences between these are tabulated below. Notice that EBCDIC/DKOI, unlike ASCII, is not uniquely defined even on the 0-127 range: 8859-5 037 500 JNET FORTRAN 0x21 0x5a 0x4f 0x5a 0x4f exclamation point (bang) 0x5b 0xba 0x4a 0xad 0x4a opening square bracket 0x5d 0xbb 0x5a 0xbd 0x5a closing square bracket 0x5e 0xb0 0x5f 0x5f 0x5f circumflex accent 0x7c 0x4f 0xbb 0x6a 0x4f logical or (vertical bar) [a2] 0x4a 0xb0 0x43 0x43 centsign (in 037)/capital dje (in 500) [ac] 0x5f 0xba 0x54 0x54 logical not (in 037)/capital kje (in 500) 0xd5 0xef 0xef 0xbb 0xad small ie 0xe3 0x46 0x46 0x4a 0xbb small u 0xe5 0x47 0x47 0xfc 0xbd small kha 0xfc 0xdc 0xdc 0x6a 0xfc small kje For the Internet, the most important code seems to be Old KOI-8, widely used in the Relcom groups (but probably not a whole lot elsewhere). Old KOI-8 (GOST 19768-74) from 1974 more or less follows Latin transliteration order and does not include upper-case hard sign, or letters common to other Slavic Cyrillic alphabets (Bulgarian, Macedonian, Serbian, Ukrainian...). In the 0-127 range it is identical with ascii, and for the 192-254 region see the transtabl array above. Some software, including uunpack (also used in Sergej Ryzhkov's bml, aka Beauty Mail system for PCs) which is distributed by Relcom, force upper-case hard sign to 255, others (and the standard!) declare this incorrect, or perhaps reserve 255 for DEL. In an earlier version of Andrew Hume's <andrew@research.att.com> tcs, which supports conversion across a wide variety of Cyrillic encodings, this was called the "mystery DOS Cyrillic encoding", except that his sha and shcha seem to be interchanged. Tcs is available for anon ftp from research.att.com in directory /dist/tcs.shar.Z. The semantics of 128-191 in Old KOI is unclear to me. If there is an official code page (it was suggested that Xenix users might have one), please post it. For the PC community, Code Page 866 seems to be quite important. This is what Microsoft is using in its russified version of MS-DOS. In 0-31 ascii control chars are replaced by a random selection of dingbats. In 32-126 it is identical to ascii, and in 127 it has something that looks like a little house (the interpretation of such positions seems to be subject to much uncertainty). The Russian part (128-255) is identical to Brjabrin's alternativnyj variant, except for 242-251, where some of the accents/symbols of AV are replaced by non-Russian Cyrillic characters and other symbols. Unfortunately CP 866 covers only Ukrainian and Belorussian, with the vague suggestion that e.g. Macedonian users could redefine the six non-Russian Cyrillic positions. This problem is largely resolved in Code Page 1251, the Microsoft Cyrillic Windows 3.1 character set, (also endorsed by WordPerfect and Adobe), which contains all Cyrillic letters used by modern Slavic languages. CP 1251 is fully compatible with ascii on 0-127 (leaves control positions undefined), has the Russian alphabet (in order, but without io) in 192-256, and puts the non-Russian Cyrillic, Russian io, and a few symbols in 128-191. Brjabrin's Alternativnyj Variant (AV) is also widely used on PCs. It has Russian in 128 to 175 in alphabetical order except for yo, graphics characters in 176 to 223, again Russian in 224-241. The same set of graphics characters, but not in the same order, is used in Brajabin's Osnovnoj Variant: they are similar to, but not identical with, IBM Extended ASCII graphics chars (neither the set of shapes nor the code values are the exact same). AV and OV have no non-Russian Cyrillic or accented characters, but four accent marks are provided: 242 (acute below the symbol), 243 (grave below the symbol), 244 (acute above the symbol), and 245 (grave above the symbol). These, as well as upper case and lower case yo, codes 240 and 241, are in the same position in Osnovnoj Variant as well. Codes 246 - 249 are arrows, pointing right, left, down, up, in that order. Codes 250 and 251 are, in both sets described by Briabrin, the division sign and the plus/minus sign (the latter becomes a radical sign in 866). 252 is the Number symbol, 253 is a sunburst, and 254 is "end of proof". 255 is in principle unused -- in practice people put things there. For the academic community, the lack of accents is remedied by the Academic version of AV developed at Cornell, which includes upper and lower case acute-accented vowels, and lower case grave-accented vowels. These replace all but six of the graphics characters (the six that were retained are those that are necessary for drawing a single-line box). The accented vowels in this set include a grave-accented lower case yo. Also included are the letters with diacritics used in French, German, and Spanish. The complete chart and DOS/Windows software may be requested from Exceller Software Corp. 800-426-0444. (This is NOT a product endorsement -- I haven't even seen the stuff!) Cornell also developed an Academic version of CP1251. In this, non-Russian Slavic languages are not supported: their letters have been replaced by Russian accented vowels. These include upper and lower case acute-accented vowels, and lower case grave-accented vowels. Also included are upper and lower case grave-accented yo. The AcademicFont Cyrillic character set was developed by University Microcomputers, who pioneered the use of Slavic languages on IBM-compatible computers in the US in the mid-eighties. This set is included among the 11 sets in Exceller's product. It supports Slavic and some non-Slavic languages, but not accented vowels. For the Macintosh community, there is a separate code page. It is ascii below 128, has the Russian capital letters in 128-159 in alphabetical order (as usual, io is treated separately) and the Russian lowercase letters in 240-254, but lower case ja is moved to 239, its place taken by the sunburst symbol. In the 160-238 range we finde the same set of (ISO 8859-5) non-Russian Cyrillic characters as in CP 1251. The symbols that appear here are also largely the same as in 1251, but the orderings are completely different and a few symbols are unique to one or the other, e.g. permille in 1251, capital delta in the Mac encoding. While a Macintosh version capable of character conversion is still on the drawing boards, for most other platforms Columbia Kermit is capable of converting between a large variety of Cyrilic encodings. Anon ftp to watsun.cc.columbia.edu: for C-Kermit 5A(188) (Unix, VMS, OS/2, Amiga etc) get file kermit/b/ckaaaa.hlp, read it, take it from there. For MS-DOS Kermit 3.11, get (in binary mode) kermit/bin/msvibm.zip, then unzip. For IBM Mainframe Kermit 4.2 and later, get kermit/b/ik0*.* plus one of the following: kermit/b/ikc*.* for VM/CMS, kermit/b/ikt*.* for MVS, kermit/b/ikx*.* for CICS or kermit/b/ikm*.* for MUSIC. There is also a large collection of character-set tables under kermit/charsets. Finally, the most broadly accepted standard outside these communities seems to be GOSTSCI (GOSTCII), a term used colloquially to refer to Brjabrin's Osnovnoj Variant or to ISO 8859-5 (which is also ECMA 113), although these two are not identical when it comes to non-Russian Cyrillic. The term "New KOI-8" means the 1987 revision of KOI-8 (GOST 19768-87) -- all these use the same (alphabetical, except for yo) order as 8859/5, starting with A at 176. However, the non-Russian Cyrillic characters (160-176 and 240-255 in new KOI-8) are not part of OV, their space is taken up by some graphics chars described for AV above. ISO 8859-5 provides for the Cyrillic characters required for writing all major Slavic Cyrillic alphabets (Belorussian, Bulgarian, Macedonian, Serbian, Ukrainian...), but not for those alphabets that were devised for non-Slavic languages in the Soviet Union (Abkhazian, Bashkir, Chukchee, Khanty, Tajik, ....), or archaic letters. Q: Is this a big mess or what? A: To straighten this out, it seems necessary to adopt a fixed point of reference, which I take to be Unicode V1.1 = ISO 10646-1.2. While in principle 10646 is a four-byte standard and Unicode uses 16-bit integers, the "Basic Multilingual Plane" of 10646 is by definition identical to the values assigned in Unicode 1.1, both being two-byte quantities (called UCS-2 by ISO). The following list gives the essential part of the names of the Cyrillic characters and the last two hex digits of their Unicode/10646 encoding. For reasons of space, the official Unicode/10646 names have been abbreviated. For a full list of names, anon ftp to unicode.org, cd to pub/MappingTables, and get namesall.lst (which is slightly over 200k). To get back the full official name from the abbreviations, always add the prefix CYRILLIC, unless the position is UNUSED. Further, expand CAP (SMA) to CAPITAL (SMALL). Finally, the word LETTER should be added after CAP/SMA, unless it is THOUSANDS, LIGATURE, or COMBINING. The numerical code values given in the second column have also been abbreviated to the last two digits, since the preceding two hex digits (really signifying "Cyrillic") are always 04 in Unicode/10646. The third column gives the-two character mnemonic abbreviations suggested in Keld Simonsen's RFC1345 where they exist, to facilitate cross-reference to this document (available by anon ftp e.g. from sunsite.unc.edu as /pub/doc/rfp/rfp1345.txt.Z) which has tables for Serbian, Macedonian, as well as other Cyrillic encodings (IBM CP 880, INIS-cyrillic = ISO-IR-51, ECMA-cyrillic = ISO-IR-111) whose domain of usage is unclear to me, and whose table for Old KOI seems to be in fact a New KOI table. I will add conversion tables for these (or for any other) encodings provided a real user community exists and actually generates some public domain machine-readable texts. UNUSED 00 CAP IO 01 IO CAP DJE 02 D% CAP GJE 03 G% CAP E 04 IE CAP DZE 05 DS CAP I 06 II CAP YI 07 YI CAP JE 08 J% CAP LJE 09 LJ CAP NJE 0A NJ CAP TSHE 0B Ts CAP KJE 0C KJ UNUSED 0D CAP SHORT U 0E V% CAP DZHE 0F DZ CAP A 10 A= CAP BE 11 B= CAP VE 12 V= CAP GE 13 G= CAP DE 14 D= CAP IE 15 E= CAP ZHE 16 Z% CAP ZE 17 Z= CAP II 18 I= CAP SHORT II 19 J= CAP KA 1A K= CAP EL 1B L= CAP EM 1C M= CAP EN 1D N= CAP O 1E O= CAP PE 1F P= CAP ER 20 R= CAP ES 21 S= CAP TE 22 T= CAP U 23 U= CAP EF 24 F= CAP KHA 25 H= CAP TSE 26 C= CAP CHE 27 C% CAP SHA 28 S% CAP SHCHA 29 Sc CAP HARD SIGN 2A =" CAP YERI 2B Y= CAP SOFT SIGN 2C %" CAP REVERSED E 2D JE CAP IU 2E JU CAP IA 2F JA SMA A 30 a= SMA BE 31 b= SMA VE 32 v= SMA GE 33 g= SMA DE 34 d= SMA IE 35 e= SMA ZHE 36 z% SMA ZE 37 z= SMA II 38 i= SMA SHORT II 39 j= SMA KA 3A k= SMA EL 3B l= SMA EM 3C m= SMA EN 3D n= SMA O 3E o= SMA PE 3F p= SMA ER 40 r= SMA ES 41 s= SMA TE 42 t= SMA U 43 u= SMA EF 44 f= SMA KHA 45 h= SMA TSE 46 c= SMA CHE 47 c% SMA SHA 48 s% SMA SHCHA 49 sc SMA HARD SIGN 4A =' SMA YERI 4B y= SMA SOFT SIGN 4C %' SMA REVERSED E 4D je SMA IU 4E ju SMA IA 4F ja UNUSED 50 SMA IO 51 io SMA DJE 52 d% SMA GJE 53 g% SMA E 54 ie SMA DZE 55 ds SMA I 56 ii SMA YI 57 yi SMA JE 58 j% SMA LJE 59 lj SMA NJE 5A nj SMA TSHE 5B ts SMA KJE 5C kj UNUSED 5D SMA SHORT U 5E v% SMA DZHE 5F dz CAP OMEGA 60 SMA OMEGA 61 CAP YAT 62 Y3 SMA YAT 63 y3 CAP IOTIFIED E 64 SMA IOTIFIED E 65 CAP LITTLE YUS 66 SMA LITTLE YUS 67 CAP IOTIFIED LITTLE YUS 68 SMA IOTIFIED LITTLE YUS 69 CAP BIG YUS 6A O3 SMA BIG YUS 6B o3 CAP IOTIFIED BIG YUS 6C SMA IOTIFIED BIG YUS 6D CAP KSI 6E SMA KSI 6F CAP PSI 70 SMA PSI 71 CAP FITA 72 F3 SMA FITA 73 f3 CAP IZHITSA 74 V3 SMA IZHITSA 75 v3 CAP IZHITSA DOUBLE GRAVE 76 SMA IZHITSA DOUBLE GRAVE 77 CAP UK DIGRAPH 78 SMA UK DIGRAPH 79 CAP ROUND OMEGA 7A SMA ROUND OMEGA 7B CAP OMEGA TITLO 7C SMA OMEGA TITLO 7D CAP OT 7E SMA OT 7F CAP KOPPA 80 C3 SMA KOPPA 81 c3 THOUSANDS SIGN 82 NON-SPACING TITLO 83 NON-SPACING PALATALIZATION 84 NON-SPACING DASIA PNEUMATA 85 NON-SPACING PSILI PNEUMATA 86 UNUSED 87 UNUSED 88 UNUSED 89 UNUSED 8A UNUSED 8B UNUSED 8C UNUSED 8D UNUSED 8E UNUSED 8F CAP GE WITH UPTURN 90 G3 SMA GE WITH UPTURN 91 g3 CAP GE BAR 92 SMA GE BAR 93 CAP GE HOOK 94 SMA GE HOOK 95 CAP ZHE WITH RIGHT DESCENDER 96 SMA ZHE WITH RIGHT DESCENDER 97 CAP ZE CEDILLA 98 SMA ZE CEDILLA 99 CAP KA WITH RIGHT DESCENDER 9A SMA KA WITH RIGHT DESCENDER 9B CAP KA VERTICAL BAR 9C SMA KA VERTICAL BAR 9D CAP KA BAR 9E SMA KA BAR 9F CAP REVERSED GE KA A0 SMA REVERSED GE KA A1 CAP EN WITH RIGHT DESCENDER A2 SMA EN WITH RIGHT DESCENDER A3 CAP EN GE A4 SMA EN GE A5 CAP PE HOOK A6 SMA PE HOOK A7 CAP O HOOK A8 SMA O HOOK A9 CAP ES CEDILLA AA SMA ES CEDILLA AB CAP TE WITH RIGHT DESCENDER AC SMA TE WITH RIGHT DESCENDER AD CAP STRAIGHT U AE SMA STRAIGHT U AF CAP STRAIGHT U BAR B0 SMA STRAIGHT U BAR B1 CAP KHA WITH RIGHT DESCENDER B2 SMA KHA WITH RIGHT DESCENDER B3 CAP TE TSE B4 SMA TE TSE B5 CAP CHE WITH RIGHT DESCENDER B6 SMA CHE WITH RIGHT DESCENDER B7 CAP CHE VERTICAL BAR B8 SMA CHE VERTICAL BAR B9 CAP H BA SMA H BB CAP IE HOOK BC SMA IE HOOK BD CAP IE HOOK OGONEK BE SMA IE HOOK OGONEK BF PALOCHKA C0 CAP SHORT ZHE C1 SMA SHORT ZHE C2 CAP KA HOOK C3 SMA KA HOOK C4 UNUSED C5 UNUSED C6 CAP EN HOOK C7 SMA EN HOOK C8 UNUSED C9 UNUSED CA CAP CHE WITH LEFT DESCENDER CB SMA CHE WITH LEFT DESCENDER CC UNUSED CD UNUSED CE UNUSED CF CAP A WITH BREVE D0 SMA A WITH BREVE D1 CAP A WITH DIAERESIS D2 SMA A WITH DIAERESIS D3 CAP LIGATURE A IE D4 SMA LIGATURE A IE D5 CAP IE WITH BREVE D6 SMA IE WITH BREVE D7 CAP SCHWA D8 SMA SCHWA D9 CAP SCHWA WITH DIAERESIS DA SMA SCHWA WITH DIAERESIS DB CAP ZHE WITH DIAERESIS DC SMA ZHE WITH DIAERESIS DD CAP ZE WITH DIAERESIS DE SMA ZE WITH DIAERESIS DF CAP ABKHASIAN DZE E0 SMA ABKHASIAN DZE E1 CAP I WITH MACRON E2 SMA I WITH MACRON E3 CAP I WITH DIAERESIS E4 SMA I WITH DIAERESIS E5 CAP O WITH DIAERESIS E6 SMA O WITH DIAERESIS E7 CAP BARRED O E8 SMA BARRED O E9 CAP BARRED O WITH DIAERESIS EA SMA BARRED O WITH DIAERESIS EB CAP U WITH ACUTE EC SMA U WITH ACUTE ED CAP U WITH MACRON EE SMA U WITH MACRON EF CAP U WITH DIAERESIS F0 SMA U WITH DIAERESIS F1 CAP U WITH DOUBLE ACUTE F2 SMA U WITH DOUBLE ACUTE F3 CAP CHE WITH DIAERESIS F4 SMA CHE WITH DIAERESIS F5 CAP DJE WITH ACUTE F6 SMA DJE WITH ACUTE F7 CAP YERU WITH DIAERESIS F8 SMA YERU WITH DIAERESIS F9 UNUSED FA UNUSED FB UNUSED FC UNUSED FD UNUSED FE UNUSED FF Q: Is everything clear now? A: Probably not. To ease the pain, here follow some tentative conversion tables *from* the 8-bit schemes described above *to* Unicode. Since the Unicode/10646 character set is much larger, no tables are provided in the other direction. In the 0-127 range everything is ASCII (except for the CP866 dingbats in the range 0-31 which are at any rate optional, and for EBCDIC/DKOI-8, for which see above) so here tables are only provided for 128-255. Notice that often values other than starting with 0x04 are given, meaning that the Unicode equivalent is outside the Unicode Cyrillic range 0x0400-0x04ff, but included at some other place, typically among the arrows (0x2190-0x21ff) or other semigraphic material (0x2500-0x25ff). If a particular encoding leaves (by official definition, not necessarily in practical usage) some code unused, this is designated by "-1" in the conversion table. For some positions the tables show a "-2", meaning that I have no information on the intended meaning. (This is not the same as there being no Unicode codepoint for the character in question, a situation we potentially encounter with AV and OV 242-245, see note there.) /* From old Koi-8 to Unicode */ long oldkoi8tou[128] = { -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 0x044e,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433, 0x0445,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e, 0x043f,0x044f,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432, 0x044c,0x044b,0x0437,0x0448,0x044d,0x0449,0x0447,0x044a, 0x042e,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413, 0x0425,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e, 0x041f,0x042f,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412, 0x042c,0x042b,0x0417,0x0428,0x042d,0x0429,0x0427,0x042a }; /* From CP866 to Unicode */ long cp866tou[128] = { 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, 0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f, 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, 0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f, 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, 0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f, 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510, 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f, 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567, 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b, 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580, 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, 0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f, 0x0401,0x0451,0x0404,0x0454,0x0407,0x0457,0x040e,0x045e, 0x00b0,0x2022,0x00b7,0x221a,0x2116,0x00a4,0x25a0, -1 }; /* From CP1251 to Unicode */ long cp1251tou[128] = { 0x0402,0x0403,0x201a,0x0453,0x201e,0x2026,0x2020,0x2021, -1,0x2030,0x0409,0x2039,0x040a,0x040c,0x040b,0x040f, 0x0452,0x2018,0x2019,0x201c,0x201d,0x2022,0x2013,0x2014, -1,0x2122,0x0459,0x203a,0x045a,0x045c,0x045b,0x045f, 0x00a0,0x040e,0x045e,0x0408,0x00a4,0x0490,0x00a6,0x00a7, 0x0401,0x00a9,0x0404,0x00ab,0x00ac,0x00ad,0x00ae,0x0407, 0x00b0,0x00b1,0x0406,0x0456,0x0491,0x00b5,0x00b6,0x00b7, 0x0451,0x2116,0x0454,0x00bb,0x0458,0x0405,0x0455,0x0457, 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, 0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f, 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, 0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f, 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, 0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f, 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, 0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f, }; /* From Mac to Unicode */ long mactou[128] = { 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, 0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f, 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, 0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f, 0x2020,0x00b0,0x0490,0x00a3,0x00a7,0x2022,0x00b6,0x0406, 0x00ae,0x00a9,0x2122,0x0402,0x0452,0x2260,0x0403,0x0453, 0x221e,0x00b1,0x2264,0x2265,0x0456,0x03bc,0x0491,0x0408, 0x0404,0x0454,0x0407,0x0457,0x0409,0x0459,0x040a,0x045a, 0x0458,0x0405,0x00ac,0x221a,0x0192,0x2248,0x0394,0x00ab, 0x00bb,0x2026,0x0020,0x040b,0x045b,0x040c,0x045c,0x0455, 0x00b0,0x00b1,0x0406,0x0456,0x0491,0x00b5,0x00b6,0x00b7, 0x040e,0x045e,0x040f,0x045f,0x2116,0x0401,0x0451,0x044f, 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, 0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f, 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, 0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x00a4, }; /* From Alternativnyj Variant to Unicode */ long avtou[128] = { 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, 0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f, 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, 0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f, 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, 0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f, 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510, 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f, 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567, 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b, 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580, 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, 0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f, 0x0401,0x0451,0x0317,0x0316,0x0301,0x0300,0x2192,0x2190, 0x2193,0x2191,0x00f7,0x00b1,0x2116,0x00a4,0x25a0, -1 }; /* The interpretation of the four symbols following the second alphabetic block in AV remains unclear. One suggestion was to treat these as (non-spacing) grave and acute, as appearing above upper- or lowercase letters, but the graphical rendering in Briabin's original article makes clear that the distinction is between acute and grave, above or below the letter: this is what the table now has. But the preponderance of graphical symbols in AV suggests that the intention was to provide facilities for character graphics, in which case the interpretation is simply straight lines connecting two adjacent midpoints of the bounding box. If the box is the unit square, these would run from (.5,0) to (0,.5) and to (1,.5), and from (.5,1) to (0,.5) and to (1,.5), in this order. (The line segments are of course directionless.) Such symbols are not present in Unicode -- the closest things are 0x25de 0x25df 0x25dc 0x25dd (in this order) but these are curved, not straight. Whether the graphics or the accent usage is more prevalent in actual usage only those plugged into the Russian PC community can tell. If the graphics usage turns out to be prevalent, these four symbols would be reasonable candidates for incorporation into Unicode, perhaps at positions 0x25ef to 0x25f3. */ /* From Osnovnoj Variant to Unicode */ long ovtou[128] = { -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, 0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f, 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, 0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f, 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, 0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f, 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, 0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f, 0x0401,0x0451,0x0317,0x0316,0x0301,0x0300,0x2192,0x2190, 0x2193,0x2191,0x00f7,0x00b1,0x2116,0x00a4,0x25a0, -1 }; /* The same problem with the interpretation of 242-245 as in AV (these rows are definitely identical). The low positions of OV are probably identical to 176-223 in AV... */ /* From ISO8859-5 to Unicode */ long newkoi8tou[128] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x00a0,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407, 0x0408,0x0409,0x040a,0x040b,0x040c,0x00ad,0x040e,0x040f, 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, 0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f, 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, 0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f, 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, 0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f, 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, 0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f, 0x2116,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457, 0x0458,0x0459,0x045a,0x00a7,0x045c,0x045d,0x045e,0x045f }; /* Use newkoi8tou in combination with isotoibm to derive the unicode meaning of the Cyrillic range in the DKOI extension of EBCDIC. If someone has DKOI-8 text available, I'd love to actually try... */