home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / pub / public_html / accents.save < prev    next >
Text File  |  2020-01-01  |  69KB  |  1,801 lines

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html><head>
  3. <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
  4. <title>Interchange of Non-English Computer Text</title>
  5. </head><body bgcolor="#ffffff" text="#000000">
  6. <h2 align="center">Interchange of Non-English Computer Text</h2>
  7.  
  8. <center>
  9. Frank da Cruz<br>
  10. Columbia University, New York<br>
  11. 1994
  12. </center>
  13.  
  14. <p>
  15. <blockquote>
  16. <i>
  17.  
  18. This paper was written in 1994 to explain the ideas behind the character-set
  19. conversion features of the Kermit file transfer protocol, which were developed
  20. in the late 1980s and early 1990s to address the problems of meaningful
  21. interchange of text within the installed base of diverse computers using a
  22. multitude of character sets.  The problems are less acute now that the
  23. diversity of the 1970s and 80s is all but wiped out and Unicode has become the
  24. standard common universal character set.  This document is encoded in Unicode
  25. UTF-8 (properly announced) and requires a font that includes certain
  26. characters that were introduced in Unicode 3.1 and a browser that
  27. (unlike Internet Explorer) is friendly to monospace text.  Mozilla and Netscape
  28. work best.
  29.  
  30. </i>
  31. <table width="100%">
  32. <tr>
  33. <td align="right">—<i>fdc, June 2003</i></td>
  34. </table>
  35. </blockquote>
  36.  
  37. <hr>
  38. <h3>INTRODUCTION</h3>
  39.  
  40. Thirty years ago, computers and people communicated using a small
  41. repertoire of symbols, digits, and Roman letters.  Often the letters were
  42. only in uppercase, and there were no accents.  The language of computing
  43. was exclusively English.  Today, we are poised on the brink of a worldwide
  44. computer-based communications revolution, with a single character set
  45. encompassing all the world's writing systems.
  46.  
  47. <p>
  48.  
  49.    In the intervening decades, we have contrived a vast Babel of mutually
  50. incomprehensible character sets, both proprietary and standard.  The new
  51. Universal Character Set, ISO 10646 <a href="#refs">[19]</a>, offers a single
  52. common encoding for all writing systems.  But radical and massive changes are
  53. required in data entry and display hardware as well as in computer software
  54. and data files at all levels from operating system to application, and could
  55. therefore take decades to see widespread use.  In the meantime, how shall we
  56. survive our Babel?
  57.  
  58. <p>
  59.  
  60.    The problem is immediately apparent to anyone who tries to transfer
  61. non-English textual data between two different kinds of computers using
  62. conventional methods.  "P├ót├⌐" on an IBM PC becomes "PEta" on the
  63. Macintosh, and a truckload of pocket-bread is delivered instead of goose
  64. liver.
  65.  
  66. <p>
  67.  
  68.    This paper presents a simplified and condensed description of the
  69. character-set translation method developed for the Kermit file transfer
  70. protocol.  The lessons learned should be useful in any arena where text must
  71. be transmitted meaningfully between unlike computer systems.  Familiarity with
  72. the standards process in general, and the US ASCII <a href="#refs">[1]</a>,
  73. ISO 646 <a href="#refs">[14]</a>, and ISO 8859 <a href="#refs">[18]</a>
  74. character set standards is assumed, and with ISO Standards 2022 <a
  75. href="#refs">[15]</a> and 4873 <a href="#refs">[17]</a>, as well as with
  76. proprietary character sets such as IBM PC code pages.
  77.  
  78. <hr>
  79. <h3>TYPES OF CHARACTER SETS</h3>
  80.  
  81. Today's coded character sets can be classified along several axes: standard
  82. versus proprietary, 7-bit versus 8-bit, single-byte versus multibyte, and so
  83. on.  This paper treats only the character sets used in application-independent
  84. plain-text files, and not the application-specific text representations used in
  85. word processing, publishing, and similar environments that are concerned with
  86. rendering forms such as fonts, style, point size, ligatures, and so forth, and
  87. which sometimes offer character repertoires different from any plain-text
  88. character set.
  89.  
  90. <p>
  91.  
  92. <h4>Standard Character Sets</h4>
  93.  
  94. <p>
  95.  
  96. Let us define a standard character set as one that is registered in the ISO
  97. <cite>Register of Coded Characters to Be Used with Escape Sequences</cite>
  98. <a href="#refs">[21]</a> under the provisions of ISO Standard 2375 <a
  99. href="#refs">[16]</a>.  The Register, which is maintained by the European
  100. Computer Manufacturers Association (ECMA), includes listings of all
  101. ISO-registered character sets and assigns unique registration numbers and
  102. designating escape sequences to each one.
  103.  
  104. <p>
  105.  
  106.    Standard character sets are subdivided into two major types: graphic and
  107. control.  Thus ASCII, which is the USA version of ISO 646, and which most
  108. people think of as a single character set, is really two sets: the ISO 646
  109. 32-character control set (ISO registration number 001) and a 94-character
  110. graphics set (ISO registration 006).  And, as specified by ISO Standard 4873,
  111. the characters Space and Delete are not part of ASCII <i>per se</i>, but rather
  112. separate components that must always be available in the presence of a
  113. 94-character graphics set.
  114.  
  115. <p>
  116.  
  117.    Similarly, ISO 8859-1 Latin Alphabet 1, which most of us think of as a
  118. coherent 8-bit character set is, in truth, composed of the ISO 646 control set
  119. (registration 001), the ISO 646 USA graphics set (006), the characters Space
  120. and Delete, a second 32-character control set (normally, but not necessarily,
  121. ISO 6429 <a href="#refs">[20]</a>, registration 077), and a 96-character set
  122. known as "The Right-hand Part of Latin Alphabet 1" (registration 100).  Each
  123. of these pieces except Space and Delete has its own unique registration number
  124. and designating escape sequence.  There is no single, unique identifier for
  125. the 8-bit Latin-1 character set in its entirety.
  126.  
  127. <p>
  128. <hr>
  129. <blockquote>
  130. <pre>
  131.      <ΓöÇΓöÇC0ΓöÇΓöÇ> <ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇGLΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ><ΓöÇΓöÇC1ΓöÇΓöÇ> <ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇGRΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ>
  132.        00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15
  133.      ΓöîΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÉ
  134.   00 Γöé       ΓöéSP Γöé                   Γöé       Γöé   Γöé                   Γöé
  135.   01 Γöé       Γö£ΓöÇΓöÇΓöÇΓöÿ                   Γöé       Γö£ΓöÇΓöÇΓöÇΓöÿ                   Γöé
  136.   02 Γöé       Γöé                       Γöé       Γöé                       Γöé
  137.   03 Γöé   C   Γöé       ASCII           Γöé   C   Γöé        Special        Γöé
  138.   04 Γöé   o   Γöé       graphics        Γöé   o   Γöé        Graphics       Γöé
  139.   05 Γöé   n   Γöé                       Γöé   n   Γöé                       Γöé
  140.   06 Γöé   t   Γöé                       Γöé   t   Γöé                       Γöé
  141.   07 Γöé   r   Γöé                       Γöé   r   Γöé                       Γöé
  142.   08 Γöé   o   Γöé                       Γöé   o   Γöé                       Γöé
  143.   09 Γöé   l   Γöé                       Γöé   l   Γöé                       Γöé
  144.   10 Γöé   s   Γöé                       Γöé   s   Γöé                       Γöé
  145.   11 Γöé       Γöé                       Γöé       Γöé                       Γöé
  146.   12 Γöé       Γöé                       Γöé       Γöé                       Γöé
  147.   13 Γöé       Γöé                       Γöé       Γöé                       Γöé
  148.   14 Γöé       Γöé                   ΓöîΓöÇΓöÇΓöÇΓöñ       Γöé                   ΓöîΓöÇΓöÇΓöÇΓöñ
  149.   15 Γöé       Γöé                   ΓöéDELΓöé       Γöé                   Γöé   Γöé
  150.      ΓööΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÿ
  151.      <ΓöÇΓöÇC0ΓöÇΓöÇ> <ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇGLΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ><ΓöÇΓöÇC1ΓöÇΓöÇ> <ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇGRΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ>
  152. </pre>
  153.  
  154. <p>
  155.  
  156. <b>Figure 1:</b>  Structure of a Standard 8-Bit Single-Byte Character Set
  157. </blockquote>
  158. <hr>
  159. <p>
  160.  
  161.  
  162. In practice, most standard character sets have the same structure, which is
  163. illustrated in Figure 1:
  164.  
  165. <p>
  166. <ol>
  167.  
  168. <li>The 32-character control set of ISO 646 in columns 0 and 1.  This is
  169. called the C0 region.
  170.  
  171. <p>
  172.  
  173. <li>The character Space at position 2/0.
  174.  
  175. <p>
  176.  
  177. <li>A 94-character graphics set in positions 2/1 through 7/14.  This is called
  178. the Graphics Left, or GL, region.  For 7-bit character sets, these are the
  179. 84 characters of the ISO 646 International Reference Version plus 10
  180. country-specific characters.  For 8-bit sets, these are the 94 graphic
  181. characters of US ASCII.
  182.  
  183. <p>
  184.  
  185. <li>The character Delete at position 7/15.
  186.  
  187. <p>
  188.  
  189. <li>For 8-bit sets, a 32-character "right half" control set in columns 8 and
  190. 9.  This is the C1 region.
  191.  
  192. <p>
  193.  
  194. <li>For 8-bit sets, a 94- or 96-character "right half" graphics set in columns
  195. 10 through 15.  This is the Graphics Right or GR region.
  196.  
  197. <p>
  198.  
  199. <li>In multibyte graphic sets (not illustrated in the figure), each character
  200. is composed of a fixed number of bytes, generally two, with each byte in
  201. the graphic range, i.e. not corresponding to a C0 or C1 control character,
  202. and following either the 94- or 96-character structure.  Thus, single-byte
  203. control characters can be mixed with double-byte graphic characters with
  204. no ambiguity.
  205.  
  206. </ol>
  207. <p>
  208.  
  209. The rationale for reserving an area for control characters in the right half
  210. of an 8-bit set is that communications devices tend to examine only the
  211. low-order 7 bits of a character when deciding whether it is a control or
  212. graphic character.  Placing graphic characters in columns 8 and 9 often
  213. triggers unwanted control functions.
  214.  
  215. <p>
  216.  
  217.    During the early decades of computing, when 7-bit communication was the
  218. rule, ISO 646 was the predominant method for representing the special
  219. characters of each language, and each European country had its own version of
  220. ISO 646.  But this imposed severe limitations on the user.  For example, ISO
  221. 646 makes it impossible to mix (say) German text and C-language programming
  222. syntax in the same file.  The following C program fragment:
  223.  
  224. <p>
  225. <blockquote>
  226. <pre>
  227. if (~(a[i] | x)) {
  228.     printf("Gr├╝├ƒe aus K├╢ln\n");
  229. }
  230. </pre>
  231. </blockquote
  232. <p>
  233.  
  234. can not be encoded in either ASCII or in German ISO 646, because neither set
  235. has all the required characters.  If German ISO 646 is used, German special
  236. characters are substituted for the braces, brackets, and bars:
  237.  
  238. <p>
  239. <blockquote>
  240. <pre>
  241. if (├ƒ(a├äi├£ ├╢ x)) ├ñ
  242.     printf("Gr├╝├ƒe aus K├╢ln├ûn");
  243. ├╝
  244. </pre>
  245. </blockquote
  246. <p>
  247.  
  248.  
  249. whereas if ASCII is chosen, we see the opposite effect:
  250.  
  251. <p>
  252. <blockquote>
  253. <pre>
  254. if (~(a[i] | x)) {
  255.     printf("Gr}~e aus K|ln\n");
  256. }
  257. </pre>
  258. </blockquote
  259. <p>
  260.  
  261. Neither result is satisfactory, and matters only deteriorate when
  262. German-language program commentary is to be added.
  263.  
  264. <p>
  265.  
  266.    To alleviate these problems, many sites are switching to the ISO 8859 Latin
  267. alphabets.  However, the ISO 646 versions are still widely used, especially in
  268. electronic mail, a predominantly 7-bit medium.
  269.  
  270. <h4>Proprietary Character Sets</h4>
  271.  
  272. Most computers use either US ASCII <a href="#refs">[1]</a> or IBM EBCDIC <a
  273. href="#refs">[13]</a> as their basic character set.  But to support entry,
  274. display, printing, and processing of textual data in languages other than
  275. English, computer manufacturers soon recognized the need to extend these basic
  276. sets to allow representation of the accented Roman letters, non-Roman letters,
  277. ideograms, and other symbols used by the world's writing systems.
  278.  
  279. <p>
  280.  
  281.    Some manufacturers provide ISO 646 national versions, but users suffer with
  282. their limitations.  Besides the sacrifice of characters needed for programming,
  283. ISO 646 does not allow mixture of text in different languages, such as Italian,
  284. French, and Norwegian, in the same file.  So manufacturers such as Digital and
  285. IBM began to devise 8-bit international character sets for the European
  286. languages, as well as other sets for languages using other writing systems.
  287. Most of these 8-bit sets are capable of representing text in several languages,
  288. allowing a single product to serve, and work compatibly, over a broader market,
  289. for example all of Western Europe.
  290.  
  291. <p>
  292.  
  293.    Prominent among the proprietary sets are IBM's PC code pages <a
  294. href="#refs">[13]</a>.  They resemble an ISO Latin Alphabet by having ASCII in
  295. the left half, but depart from from the standard structure by using all of
  296. columns 8 through 15, including the C1 area, for graphic characters.  Thus IBM
  297. PC code pages have (at least) 32 more graphic characters than a standard 8-bit
  298. character set.  Major manufacturers including Apple and NeXT follow the IBM
  299. design, but with different character repertoires and encoding.  Others,
  300. notably Digital, Hewlett Packard, and Data General, observe the standard
  301. structure, usually with different repertoires and encoding.
  302.  
  303. <p>
  304.  
  305.    To add to the confusion, we also have IBM's many EBCDIC-based code pages,
  306. whose structure does not follow any national or international standard, as
  307. well as variations on IBM-like mainframes manufactured in Eastern Europe and
  308. the Far East, plus unknown numbers of proprietary sets from other
  309. manufacturers.
  310.  
  311. <h4>The Current Situation</h4>
  312.  
  313. Today we are confronted with hundreds of different coded character sets, both
  314. standard and proprietary.  These sets differ in important ways:
  315.  
  316. <p>
  317. <ul>
  318. <li><i>Size:</i> The total code space, 7-bit or 8-bit, single byte or
  319. multibyte.
  320. <li><i>Structure:</i> Standard or nonstandard allocation of control and
  321. graphics areas.
  322. <li><i>Repertoire:</i> The particular selection of characters.
  323. <li><i>Encoding:</i> The particular code values assigned to each character.
  324. </ul>
  325. <p>
  326.  
  327. Every application-independent plain-text file is encoded in a particular
  328. character set.  It is generally not possible to mix character sets within a
  329. plain-text file.  Furthermore, a text file generally does not contain any
  330. indication of its character set.  Neither, in general, does the host operating
  331. system identify a file's character set, nor indeed, provide any mechanism to do
  332. so.
  333.  
  334. <p>
  335.  
  336.    Within most applications and computing environments, a certain character
  337. set is simply <i>assumed</i>.  When a workstation supports multiple character
  338. sets, or when data must be communicated between unlike computers, there is no
  339. automatic mechanism for software applications to identify a file's character
  340. set, and hence no way to automatically display its characters correctly, nor
  341. to announce the character set to another computer or application during data
  342. transfer.
  343.  
  344. <p>
  345.  
  346.    This problem has grown over the past decade as computers have become
  347. increasingly interconnected, and so are used increasingly for communication of
  348. text: news, conferencing, file transfer and sharing, and electronic mail.  Not
  349. only are text character sets likely to be incompatible, but there are no
  350. universally accepted methods for translation.
  351.  
  352. <p>
  353.  
  354. <h4>Character Set Translation</h4>
  355.  
  356. <p>
  357.  
  358. Characters, such as the letter A, are represented in the computer, and in
  359. telecommunications, by numeric codes.  Different computers use different codes
  360. for the same character.  For example, the letter A is code 65 in ASCII, code
  361. 193 in EBCDIC, and code 9025 in JIS X 0208.
  362.  
  363. <p>
  364.  
  365.    The most commonly used translation function is a simple array-indexing
  366. operation.  Suppose we are translating from character set <i>A</i> to
  367. character set <i>B</i>, and each set has 256 characters, and the characters in
  368. each set are represented by 8-bit code values in the range 0..255.  The
  369. translation is accomplished by a linear array of 256 8-bit elements called a
  370. translation table.  The table element at position <i>i</i> contains the
  371. translation from the character in set <i>A</i> whose code is <i>i</i> to the
  372. corresponding character in set <i>B</i>, namely its code in set <i>B</i>.  For
  373. example, the 65th element of an ASCII-to-EBCDIC translation table would be the
  374. number 193.
  375.  
  376. <p>
  377.  
  378.    During the translation process, a particular input character, <i>c_in</i>,
  379. in set <i>A</i> is translated to the output character, <i>c_out</i>, in set
  380. <i>B</i> by an array indexing operation as in this example, written in the
  381. C programming language:
  382.  
  383. <p>
  384. <p>
  385. <blockquote>
  386. <pre>
  387. unsigned char a_to_b[256] = { ... };  /* Translation table */
  388. unsigned char c_in, c_out;            /* Input and output characters */
  389.  
  390. c_out = a_to_b[c_in];                 /* Translation function */
  391. </pre>
  392. </blockquote
  393. <p>
  394.  
  395. where the <i>c_in</i> variable is used as a subscript to the <i>a_to_b</i>
  396. array, and the notation <tt>{ ... }</tt> stands for the
  397. initialization of the translation table.  In practice, the braces contain the
  398. quantities forming the table, in the appropriate order.
  399.  
  400. <p>
  401.  
  402.    In constructing a translation function between any pair of character sets,
  403. there are three important and often conflicting goals:
  404.  
  405. <p>
  406. <ol>
  407.  
  408. <li><i>Invertibility</i> (I): After translating text from <i>A</i> to
  409. <i>B</i>, and then back to <i>A</i>, is the result identical to the original?
  410.  
  411. <p>
  412.  
  413. <li><i>Readability</i> (R): After translating text from <i>A</i> to <i>B</i>,
  414. is the result readable?
  415.  
  416. <p>
  417.  
  418. <li><i>Consistency</i> (C): Are translations from <i>A</i> to <i>B</i> by
  419. different applications the same?
  420.  
  421. </ol>
  422. <p>
  423.  
  424. In attempting to achieve these goals, we must look at the size, structure, and
  425. repertoire of the two character sets.  In many cases, the R-versus-I decision
  426. is forced upon us, but in others a choice is possible.  For example, consider
  427. translating between two character sets of the same size: Latin-1 and
  428. Latin/Cyrillic.  An invertible translation is possible that will not be
  429. readable, and a readable translation is possible that is not invertible.  In
  430. cases like this, the best course is to let the user set the translation goal.
  431.  
  432. <h4>Invertibility</h4>
  433.  
  434. Invertibility is important in cases where the exact contents of the file is
  435. important, or when the goal of data transfer is not necessarily final usage.
  436. Suppose, for example, you compose a C-language program (in ASCII) on your PC,
  437. transfer it to an IBM mainframe (where it is converted to EBCDIC), work on it
  438. some more, and then transfer it back to your PC.  If the character-set
  439. translation from the PC to the mainframe and back is not invertible, you will
  440. likely not be able to compile the program again on your PC without syntax
  441. errors.
  442.  
  443. <p>
  444.  
  445.    An invertible translation from character set <i>A</i> to character set
  446. <i>B</i> is possible only if <i>A</i> is smaller than or the same size as
  447. <i>B</i>.  Similarly, an invertible translation from character set <i>B</i> to
  448. character set <i>A</i> is possible only if <i>B</i> is smaller than or the
  449. same size as <i>A</i>.  So it follows that invertibility can be achieved in
  450. both directions only if the two character sets are the same size.  The
  451. following discussion applies only to bidirectional invertibility.
  452.  
  453. <p>
  454.  
  455. The intersection of the two character sets <i>A</i> and <i>B</i>, written
  456. <i>A</i> Γê⌐ <i>B</i>, is the set of characters, <i>c</i>,
  457. that both sets have in common, that is, all
  458. the characters are members of (Γêê) both <i>A</i> and <i>B</i>:
  459.  
  460. <p>
  461. <blockquote>
  462. <i>A</i> Γê⌐ <i>B</i> = { <i>c</i> : <i>c</i> Γêê <i>A</i>, <i>c</i> Γêê <i>B</i> }
  463. </blockquote>
  464. <p>
  465.  
  466. The characters in <i>A</i> that are not in <i>B</i> can be written as:
  467.  
  468. <p>
  469. <blockquote>
  470. <i>A</i> \ <i>B</i>  =  { <i>c</i> : <i>c</i> Γêê <i>A</i>, <i>c</i> Γêë <i>B</i> }
  471. </blockquote>
  472. <p>
  473.  
  474. and the characters in <i>B</i> that are not in <i>A</i> are:
  475.  
  476. <p>
  477. <blockquote>
  478. <i>B</i> \ <i>A</i>  =  { <i>c</i> : <i>c</i> Γêê <i>B</i>, <i>c</i> Γêë <i>A</i> }
  479. </blockquote>
  480. <p>
  481.  
  482.    To make an invertible translation table, the characters of
  483. <i>A</i> Γê⌐ <i>B</i>
  484. are paired together: the letter "E" in one set to "E" in the other, "├ê"
  485. in one set to "├ê" in the other, and so on.  The characters in
  486. <i>A</i> \ <i>B</i> are
  487. paired 1-to-1 with the characters in
  488. <i>B</i> \ <i>A</i> according to <i>some criterion</i>:
  489. readability, consistency, whimsy, or caprice.  The exact method for pairing
  490. the leftovers is problematic, and frequently a particular pair makes no sense
  491. at all, for example "L-with-stroke" with "Vulgar fraction 3/4".
  492.  
  493. <p>
  494.  
  495.    Any 1-to-1 pairing will give an invertible translation, but to achieve the
  496. most useful translation it is necessary to examine all the character sets
  497. involved.  To illustrate, Latin Alphabet 1 lacks the OE digraph character but
  498. this character is found in the Digital Multinational character set, the Apple
  499. Quickdraw set, the Hewlett Packard Roman8 set, the Data General International
  500. set, and the NeXT character set, but at different code points in each.
  501. Ideally, the translations for each of these character sets would map OE
  502. digraph into the same Latin-1 code point, so that text translated from (say)
  503. NeXT to Latin-1 and thence to Data General would keep its OE intact.  But this
  504. would require an unprecedented degree of cooperation among competing
  505. manufacturers.
  506.  
  507. <p>
  508.  
  509.    The construction of invertible translations between private and standard
  510. character sets is beyond the scope of the national and international standards
  511. organizations, nor should these translations be made arbitrarily by
  512. programmers.  Translation tables (or algorithms) are most appropriately
  513. furnished by the creators or owners of each private character set.  This lends
  514. the appropriate "official" air and allows all software developers to use the
  515. same translations, thus promoting interoperability of diverse applications.
  516. In 1990, IBM became one of the few computer manufacturers to take this step
  517. when it published invertible tables between ISO 8859-1 and its code pages 500
  518. and 850 in its Character Data Representation Architecture Registry <a
  519. href="#refs">[13]</a>.
  520.  
  521. <p>
  522.  
  523.    Other translations, however, are lacking from IBM, for example between its
  524. Cyrillic code pages and the ISO Latin/Cyrillic alphabet; similarly for Hebrew,
  525. Arabic, Greek, and so on.  Official invertible translations of any kind seem
  526. to be entirely lacking from most other computer and software makers.
  527.  
  528. <h4>A Simple Rule</h4>
  529.  
  530. In the absence of an official translation, a simple procedure can be used to
  531. produce consistent invertible translations across all applications.  Let us
  532. assume that <i>P</i> is a private nonstandard character set, and that <i>S</i>
  533. is a standard character set, and that <i>P</i> and <i>S</i> are the same size,
  534. <i>n</i>.  Follow these steps to construct the translation table from <i>P</i>
  535. to <i>S</i> as an array, <i>p_to_s</i>, of <i>n</i> elements:
  536.  
  537. <p>
  538. <ol>
  539.  
  540. <li>The characters that are common to <i>P</i> and <i>S</i>,
  541. <i>P</i> Γê⌐ <i>S</i>, are mapped together.  For each such
  542. character in <i>P</i>, whose code value is <i>i</i>,
  543. <i>p_to_s</i><tt>[</tt><i>i</i><tt>]</tt> takes the corresponding character's
  544. code value from <i>S</i>.
  545.  
  546. <p>
  547.  
  548. <li>The members of <i>A</i> \ <i>B</i> and <i>B</i> \ <i>A</i> are paired with
  549. each other in code order.
  550.  
  551. </ol>
  552. <p>
  553.  
  554. This procedure guarantees that <i>p_to_s</i> has exactly <i>n</i> unique
  555. elements.
  556.  
  557. <p>
  558.  
  559.    Step (1) is not always easy.  All too frequently, private character sets
  560. are documented only by tables showing the graphic characters, often unclearly
  561. (as when working from a fax of third-generation photocopy), with no names or
  562. other identifiers assigned to the characters.  Even when the material is
  563. legible and names are assigned, conventions for graphic representation differ,
  564. and so do the names.  Thus, some knowledge of languages, writing systems,
  565. world and corporate cultures, history, and politics is helpful.
  566.  
  567. <p>
  568.  
  569.    Let's say that character set <i>P</i> consists of four characters, the
  570. letters A, B, C, and D, whose code values are 0, 1, 2, and 3, respectively.
  571. And set <i>S</i> consists of the letters B, X, A, and Y, also with code values
  572. 0, 1, 2, and 3, in that order.  The letters <i>A</i> and <i>B</i> are common
  573. to both sets.  <i>A</i> is represented by code 0 in <i>P</i> and by code 2 in
  574. <i>S</i>, so:
  575.  
  576. <p>
  577. <blockquote>
  578. <pre>
  579. p_to_s[0]  =  2
  580. </pre>
  581. </blockquote
  582. <p>
  583.  
  584. Similarly for the letter B:
  585.  
  586. <p>
  587. <blockquote>
  588. <pre>
  589. p_to_s[1]  =  0
  590. </pre>
  591. </blockquote
  592. <p>
  593.  
  594. Positions 2 and 3 of our translation array remain empty, so we assign them in
  595. code order:
  596.  
  597.  
  598. <p>
  599. <blockquote>
  600. <pre>
  601. p_to_s[2]  =  1
  602. p_to_s[3]  =  3
  603. </pre>
  604. </blockquote
  605. <p>
  606.  
  607. and the translation from <i>P</i> to <i>S</i> is complete.  Each element of
  608. the <i>p_to_s</i> array has a unique value.
  609.  
  610. <p>
  611.  
  612.    To create the reverse translation table from <i>S</i> to <i>P</i>,
  613. <i>s_to_p</i>, we could repeat the process in the reverse direction, or,
  614. equivalently (and more safely), simply turn the <i>p_to_s</i> table "inside
  615. out" by sorting it according to its values.  Here is a C language program
  616. fragment that does the job:
  617.  
  618. <p>
  619.  
  620.  
  621. <p>
  622. <blockquote>
  623. <pre>
  624. for (i = 0; i < n; i++)
  625.   s_to_p[p_to_s[i]] = i;
  626. </pre>
  627. </blockquote
  628.  
  629. <p>
  630.  
  631. This leaves us with the two translation tables:
  632.  
  633. <p>
  634. <blockquote>
  635. <table border>
  636. <tr>
  637. <th>Index
  638. <th>p_to_s
  639. <th>s_to_p
  640. <tr>
  641. <td align="center">0
  642. <td align="center">2
  643. <td align="center">1
  644. <tr>
  645. <td align="center">1
  646. <td align="center">0
  647. <td align="center">2
  648. <tr>
  649. <td align="center">2
  650. <td align="center">1
  651. <td align="center">0
  652. <tr>
  653. <td align="center">3
  654. <td align="center">3
  655. <td align="center">3
  656. </table>
  657. </blockquote>
  658. <p>
  659.  
  660.    Naturally, such an arbitrary method will please few (hence the foregoing
  661. plea for more-sensible <i>official</i> invertible translations); in this case C
  662. becomes X and vice versa.  But <i>vice-versa</i> is exactly what is needed for
  663. invertibility and consistency.  Those characters the two sets have in common
  664. are translated readably, and the rest are translated according to the Simple
  665. Rule for <i>consistent</i> invertibility.
  666.  
  667. <p>
  668.  
  669.    In a more useful application of the Simple Rule, let us construct an
  670. invertible mapping between two real-life, 8-bit, single-byte character sets,
  671. Data General International (DGI) <a href="#refs">[7]</a> and ISO 8859-1 <a
  672. href="#refs">[18]</a>, between which there is no official invertible mapping.
  673. We begin by finding all the characters from DGI that are also in Latin-1 (80
  674. of them) and make the appropriate mappings.  We are left with two lists of
  675. sixteen unmatched characters.  Applying the Simple Rule, the lists are sorted
  676. in code order and placed side-by-side to obtain the following correspondence:
  677.  
  678. <p>
  679. <blockquote>
  680. <table border>
  681. <tr>
  682. <td>160
  683. <td>Undefined
  684. <td>160
  685. <td>No-break space
  686. <tr>
  687. <td>175
  688. <td>Double dagger
  689. <td>166
  690. <td>Broken bar
  691. <tr>
  692. <td>179
  693. <td>Trade mark uncircled
  694. <td>173
  695. <td>Soft hyphen
  696. <tr>
  697. <td>180
  698. <td>Florin sign
  699. <td>175
  700. <td>Macron
  701. <tr>
  702. <td>183
  703. <td>Less-than-or-equal sign
  704. <td>184
  705. <td>Cedilla
  706. <tr>
  707. <td>184
  708. <td>Greater-than-or-equal sign
  709. <td>185
  710. <td>Superscript one
  711. <tr>
  712. <td>186
  713. <td>Grave accent
  714. <td>188
  715. <td>Vulgar fraction one quarter
  716. <tr>
  717. <td>191
  718. <td>Up arrow
  719. <td>190
  720. <td>Vulgar fraction three quarters
  721. <tr>
  722. <td>215
  723. <td>Capital OE digraph
  724. <td>208
  725. <td>Capital Icelandic letter Eth
  726. <tr>
  727. <td>220
  728. <td>Undefined
  729. <td>215
  730. <td>Multiplication sign
  731. <tr>
  732. <td>221
  733. <td>Uppercase letter Y diaeresis      
  734. <td>221
  735. <td>Capital letter Y with acute accent
  736. <tr>
  737. <td>222
  738. <td>Undefined
  739. <td>222
  740. <td>Capital Icelandic letter Thorn
  741. <tr>
  742. <td>223
  743. <td>Undefined
  744. <td>240
  745. <td>Small Icelandic letter eth
  746. <tr>
  747. <td>247
  748. <td>Small oe digraph
  749. <td>247
  750. <td>Division sign
  751. <tr>
  752. <td>254
  753. <td>Undefined
  754. <td>253
  755. <td>Small letter y with acute accent
  756. <tr>
  757. <td>255
  758. <td>Fill character light
  759. <td>254
  760. <td>Small Icelandic letter thorn
  761. </table>
  762. </blockquote>
  763. <p>
  764.  
  765. So if <i>P</i> is DGI and <i>S</i> is Latin-1, then
  766. <i>p_to_s</i><tt>[160]</tt> = 160,
  767. <i>p_to_s</i><tt>[175]</tt> = 166, …,
  768. <i>p_to_s</i><tt>[255]</tt> = 254, and the <i>P</i> to <i>S</i>
  769. mapping is complete.  The <i>s_to_p</i> array is obtained by exchanging the
  770. index and value of each <i>p_to_s</i> element, as in the program fragment
  771. given above.
  772.  
  773. <h4>Readability</h4>
  774.  
  775. Bidirectional invertibility cannot be achieved when the character sets are
  776. different sizes, nor can invertibility be achieved from a larger set to a
  777. smaller set.  In such cases, readability becomes the only sensible translation
  778. goal.  Even in cases where invertibility is possible, readability might be
  779. preferred for a particular data transfer.
  780.  
  781. <p>
  782.  
  783. When translating from a larger set, <i>A</i>, to a smaller one, <i>B</i>,
  784. several different characters in <i>A</i> can be mapped to a single character
  785. in B.  For example, the following Latin-1 characters:
  786.  
  787. <p>
  788. <blockquote>
  789. ├á  ├í  ├ó  ├ú  ├ñ  ├Ñ  ├ª
  790. </blockquote>
  791. <p>
  792.  
  793. might all be mapped to the letter "a" when translating to ASCII.  In the
  794. resulting ASCII file, we can't tell where a particular "a" came from, so we
  795. can't reconstruct the original Latin-1 text when translating in the reverse
  796. direction.  But the ASCII file is more intelligible than if we had used some
  797. other mapping, such as simply stripping off the high-order bit.  Translation
  798. by removing diacritics is useful with Roman-based languages, such as French;
  799. "p├ót├⌐" becomes "pate" rather than (say) "pbti".  Or German:
  800. "Gr├╝├ƒe aus K├╢ln" becomes "Gruse aus Koln" instead of
  801. "Gr|_e aus Kvln".
  802.  
  803. <p>
  804.  
  805.    In German, the words "Gruse" and "Grusse" have entirely different meanings
  806. (we don't want to say "soot" when we mean "greetings").  We can do better.
  807. European languages like German, Swedish, Norwegian, Danish, Icelandic, and
  808. Dutch have rules for converting accented or other special characters into
  809. unadorned ABC's.  For example, any German vowel with an umlaut (diaeresis) can
  810. be written without the umlaut and followed by the letter "e".  These rules are
  811. specific to each language.  So while we can write the German word
  812. "K├╢ln" as "Koeln", we cannot write the English word
  813. "co├╢peration" as "cooeperation".
  814.  
  815. <p>
  816.  
  817.    Such language rules can not be applied blindly in reverse.  For example, if
  818. "oe" were translated back to "├╢", then "Kommandoebene" would become
  819. "Kommand├╢bene" (not a German word), and <tt>AUTOEXEC.BAT</tt> would
  820. become <tt>AUT├ûXEC.BAT</tt> (a PC file that you don't want to rename!).
  821.  
  822. <p>
  823.  
  824.    Construction of a readable translation between two entirely different
  825. alphabets, such as Cyrillic and Roman, is called transliteration.  The
  826. specific transliteration rules must take into account not only the alphabets
  827. themselves, but also what languages they represent.  For example, the surname
  828. of a former leader of the former USSR,
  829. КРУЩЕВ,
  830. is transliterated into Roman letters as "Khrushchev" in English, but into
  831. "Khruschtschew" in German.
  832.  
  833. <p>
  834.  
  835.    Newspapers and magazines, libraries, immigrant bureaus, and other
  836. organizations have their own standard procedures for transliterating "foreign"
  837. writing systems.  Not just in "ASCII-speaking" lands, but everywhere: Russian
  838. names are written in Arabic newspapers, Hebrew names in Greek journals,
  839. English names on Chinese passports, Korean publications in Vietnamese library
  840. catalogs.  But these standards are not widely known.  When a standard can be
  841. found, use it.  If not, look harder.
  842.  
  843. <hr>
  844. <h3>CHARACTER-SET TRANSLATION IN THE KERMIT FILE TRANSFER PROTOCOL</h3>
  845.  
  846. The Kermit File Transfer Protocol was developed at Columbia University to
  847. allow the transfer of both text and binary files among all types of personal
  848. computers, minicomputers, and mainframes, in both the 7-bit and 8-bit
  849. communication environments.  Kermit is a layered, point-to-point,
  850. transport-independent, error-correcting packet protocol described in detail
  851. elsewhere <a href="#refs">[5]</a>.
  852.  
  853. <p>
  854.  
  855.    Transfer of text files between unlike computers requires conversion of both
  856. record format and character set at the presentation layer.  For example, a
  857. document composed under the UNIX operating system using the ASCII character
  858. set with lines separated by imbedded Linefeed characters, upon transfer to an
  859. IBM mainframe, is converted to EBCDIC encoding and a mainframe-specific
  860. variable- or fixed-length record format.  Kermit accomplishes this conversion
  861. with another Simple Rule: during file transfer, the character set used for
  862. text files is ASCII, and the record format is stream, with records (lines)
  863. delimited by Carriage Return and Linefeed.
  864.  
  865. <p>
  866.  
  867.    Thus, it is the responsibility of each Kermit program to convert between
  868. the text character sets and record formats of its own computer and the
  869. standard Kermit format.  This means that no Kermit program needs to know the
  870. specific codes and formats of any kind of computer except its own, and it
  871. forms the basis of Kermit's strategy for converting between different
  872. character sets.  This idea is known as a "common intermediate representation,"
  873. and it lies at the heart of any presentation-layer protocol <a
  874. href="#refs">[26]</a>.
  875.  
  876. <p>
  877.  
  878.    By the mid 1980s, Kermit had become a de facto standard for file transfer.
  879. Kermit software programs had been written for almost every kind of computer in
  880. existence.  But the Kermit protocol lacked a formal and consistent means for
  881. exchanging text that contained non-Roman or accented Roman characters.  Files
  882. could be transferred, but the results would be gibberish unless the receiving
  883. computer supported the same character set as the sender.
  884.  
  885. <p>
  886.  
  887.    At first, this problem was remedied by pre- or postprocessing.  But this
  888. approach places an unreasonable burden on the user.  Not only must extra steps
  889. be taken, but a suitable translation utility must be found for every pair of
  890. character sets.  More subtly, translation utilities (for example, between an
  891. IBM code page and a Macintosh character set) are constructed in an ad-hoc
  892. manner, with no guarantee of consistency from one utility to another.
  893.  
  894. <p>
  895.  
  896.    The problem is compounded by the rapid proliferation of proprietary,
  897. national, and international standard character sets.  By the late 1980s, there
  898. were many encodings for each major writing system, a problem pointed out by
  899. attendees at international conference sessions on Kermit in Europe and Japan
  900. <a href="#refs">[10]</a>.  A consistent approach to character-set translation
  901. had become an urgent matter.
  902.  
  903. <h4>Basic Design Principles</h4>
  904.  
  905. How can we enable meaningful exchange of text between any two computers?  The
  906. obvious approach is to require each data-transfer application to understand
  907. every character set in existence.  This works adequately when the number of
  908. sets is small and stable, but quickly becomes unwieldy and unmanageable as the
  909. number increases.  If the number of character sets is <i>n</i>, the number of
  910. translations is:
  911.  
  912. <p>
  913. <blockquote id="eqn1">
  914. <table width="100%">
  915. <tr>
  916. <td><pre>
  917. ΓÄ¢ <i>n</i> ΓÄ₧         <i>n</i>!     
  918. ΓÄ£   Γă =  ———————————  =  <i>n</i>  ×  (<i>n</i> - 1) 
  919. ΓÄ¥ 2 ΓÄá    2! × (<i>n</i>-2)!
  920. </pre>
  921. <td align="right">(1)</td>
  922. </table>
  923. </blockquote>
  924. <p>
  925.  
  926. If we have two character sets, <i>A</i> and <i>B</i>, we need two
  927. translations, one from A to <i>B</i> and one from <i>B</i> to A.  If we have
  928. three sets — <i>A</i>, <i>B</i>, and <i>C</i> — we need
  929. 3 × 2 = 6 translations: <i>AB</i>, <i>BA</i>,
  930. <i>AC</i>, <i>CA</i>, <i>BC</i>, and <i>CB</i>.  And so on.
  931.  
  932. <p>
  933.  
  934.    Now consider that in 1990, IBM alone listed 276 different coded
  935. character-set identifiers in its registry <a href="#refs">[13]</a>.  If we
  936. wanted translations between every pair of IBM character sets, there would be
  937. 75,900 of them!  Add in all the other sets from all the other companies to
  938. appreciate the magnitude of the problem.
  939.  
  940. <p>
  941.  
  942.    By using a standard intermediate representation for each type of character
  943. set (Roman, Cyrillic, Hebrew, Japanese, etc), we eliminate the need for any
  944. particular computer to know about the character sets used by any other kind of
  945. computer.  Kermit's common intermediate character set, previously always
  946. ASCII, is now allowed to be any of a small number of character sets.  The set
  947. used during a particular file transfer is called the transfer character set
  948. (TCS).
  949.  
  950. <p>
  951.  
  952.    The character set of the file that is being sent or received is called the
  953. file character set (FCS).  The sender translates from its local codes (the
  954. FCS) to the standard ones (the TCS), and the receiver translates from TCS
  955. codes to its own FCS, as shown in Figure 2.
  956.  
  957. <p>
  958. <hr>
  959. <blockquote>
  960. <pre>
  961.      COMPUTER A                                COMPUTER B
  962. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ                      ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  963. Γöé ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ  Γöé                      Γöé  ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ Γöé
  964. Γöé Γöé Translation Γöé  Γöé      Transfer        Γöé  Γöé Translation Γöé Γöé
  965. Γöé Γöé Function:   ΓöéΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ>Γöé Function:   Γöé Γöé
  966. Γöé Γöé FCS to TCS  Γöé  Γöé    Character Set     Γöé  Γöé TCS to FCS  Γöé Γöé
  967. Γöé ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  Γöé                      Γöé  ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ Γöé
  968. Γöé       ^          Γöé                      Γöé        Γöé         Γöé
  969. Γöé       Γöé          Γöé                      Γöé        v         Γöé
  970. Γöé  Kermit Program  Γöé                      Γöé  Kermit Program  Γöé
  971. Γöé      SEND        Γöé                      Γöé     RECEIVE      Γöé
  972. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ                      ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  973.         ^                                          Γöé
  974.         Γöé                                          v
  975. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ                      ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  976. Γöé  Local File      Γöé                      Γöé  Local File      Γöé
  977. Γöé  Character Set A Γöé                      Γöé  Character Set B Γöé
  978. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ                      ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  979. </pre>
  980. <b>Figure 2:</b>  File Transfer Character-Set Translation
  981. </blockquote>
  982. <hr>
  983. <p>
  984.  
  985. For a particular file and transfer character set combination, a Kermit
  986. program has one translation function for sending files and another for
  987. receiving them.  Theoretically, all combinations of file and transfer
  988. character set are allowed.  Thus the number of translation functions,
  989. <i>f</i>, is given by:
  990.  
  991. <p>
  992. <blockquote id="eqn2">
  993. <table width="100%">
  994. <tr>
  995. <td align="left"><i>f</i> = <i>tcs</i> × <i>fcs</i> × 2
  996. <td align="right">(2)
  997. </table>
  998. </blockquote>
  999. <p>
  1000.  
  1001. That is, one function in each direction, for each combination of TCS and FCS.
  1002. While this number is significantly lower than the number of pairs of all
  1003. character sets (<a href="#eqn1">Equation 1</a>), we still want to reduce it to
  1004. conserve computer memory and cut down on user confusion.
  1005.  
  1006. <h4>The Transfer Character Set</h4>
  1007.  
  1008. <p>
  1009.  
  1010. Generally, we want to support all the file character sets used on a particular
  1011. computer, so the way to keep the total number of translation functions small
  1012. is to minimize the number of transfer character sets that can handle the given
  1013. selection of file character sets.  This is done, in part, by restricting the
  1014. set of possible transfer character sets to a small number according to the
  1015. following rules:
  1016.  
  1017. <p>
  1018. <ol>
  1019. <li>The transfer character set must be a national or international standard
  1020. character set registered with the ISO, or a combination of such sets.
  1021. This means that its structure is consistent with other standard character
  1022. sets and that it has a unique identifier.  Furthermore, it means that the
  1023. character set is well known, its specification is readily available, and
  1024. the characters have names.
  1025.  
  1026. <p>
  1027.  
  1028. <li>US ASCII <a href="#refs">[1]</a> is included for compatibility with the
  1029. original Kermit protocol and with unextended Kermit programs.
  1030.  
  1031. <p>
  1032.  
  1033. <li>The ISO 8859 Latin Alphabets <a href="#refs">[18]</a> are included.
  1034.  
  1035. <p>
  1036.  
  1037. <li>The ISO-registered Chinese <a href="#refs">[4]</a>, Japanese <a
  1038. href="#refs">[22, 23, 24]</a>, and Korean <a href="#refs">[25]</a> sets are
  1039. included.  These are usually used in conjunction with one or more single-byte
  1040. sets that provide control characters and single-width ASCII or ISO 646
  1041. graphics.
  1042.  
  1043. <p>
  1044.  
  1045. <li>Additional sets, such as (for example) Vietnamese VSCII <a
  1046. href="#refs">[8, 28]</a>, can be included if they are registered with the ISO,
  1047. as long as they are not proper subsets of any of those already included.
  1048.  
  1049. <p>
  1050.  
  1051. <li>All else being equal, a simple and compact representation is preferred.
  1052.  
  1053. </ol>
  1054. <p>
  1055.  
  1056.    The national versions of ISO 646 <a href="#refs">[14]</a> (other than US
  1057. ASCII) are not included because of Rule 5; these sets are covered adequately
  1058. by the ISO Latin alphabets.  CCITT (ITU-T) T.61 <a href="#refs">[2]</a>, which
  1059. represents accented characters exclusively by composition, is not included for
  1060. reasons 1, 5, and 6.
  1061.  
  1062. <p>
  1063.  
  1064.    Table 1 lists the transfer character sets presently allowed by the Kermit
  1065. protocol.  The Kermit Name allows uniform reference to these sets by Kermit
  1066. software users.  The requirement for ISO registration provides for unique and
  1067. incontestible identifiers for Kermit's transfer character sets.  The Kermit
  1068. Designator is the means by which the sending Kermit program informs the
  1069. receiver of the transfer character set, a key part of the presentation
  1070. protocol.  As noted earlier, however, ISO standards do not provide a single
  1071. designator for a complete character set, but rather separate designators for
  1072. its pieces.  Thus Latin-1 is designated as "I6/100", meaning that the left
  1073. half (G0) is ASCII and the right half (G1) is "the Right-hand Part of Latin
  1074. Alphabet 1."  The C0 and C1 control regions are not explicitly designated.
  1075. The C0 region is assumed to be the normal ASCII and ISO 646 control set, with
  1076. format effectors used to delimit records and so on.  The C1 set is assumed to
  1077. be ISO 6429 to allow the use of character-set shifting functions such as SS2
  1078. and SS3 <a href="#refs">[15]</a>, for example in Japanese EUC.
  1079.  
  1080. <p>
  1081.  
  1082.    In the Kermit Designator, the initial letter "I" indicates ISO registration
  1083. numbers for character sets, leaving open the possibility for other
  1084. registration authorities.  Japanese EUC (Extended UNIX Code) is a special
  1085. case, having three parts, chosen in preference to JIS X 0208 alone to allow
  1086. the commonly used mixture of single-width and double-width characters.  The
  1087. registration numbers are listed in G0/G1/G2 order, so SS2 is required to shift
  1088. between Kanji (ISO 87) and Katakana (ISO 13) in accordance with ISO 2022.
  1089.  
  1090. <p>
  1091.  
  1092.    This notation is used in preference to, say, the name of the standard
  1093. itself (for example "ISO8859-1") because the same character set can be defined
  1094. by more than one standard (for example, Latin-1 and ECMA 94), and one standard
  1095. can specify more than one character set (e.g. ISO 646).
  1096.  
  1097. <p>
  1098.  
  1099.    Using a standard international character set as the TCS, it is possible to
  1100. transfer text written in a language other than English between unlike
  1101. computers, and it is usually also possible to transfer text containing a
  1102. mixture of languages.  For example, text in Latin Alphabet 1 might contain a
  1103. mixture of Italian, Norwegian, French, German, English, and Icelandic.
  1104.  
  1105. <p>
  1106.  
  1107.    A particular Kermit program need not incorporate all the defined transfer
  1108. character sets.  In many cases, a single 8-bit set will suffice, such as
  1109. LATIN1 for Western Europe, LATIN2 for Eastern European languages with
  1110. Roman-based writing systems, CYRILLIC for Russia, and so on.  Thus <a
  1111. href="#eqn2">Equation 2</a> generally results in a comfortably small number.
  1112. For example, an IBM PC that supports five Roman-alphabet code pages for
  1113. Western European languages plus a Cyrillic code page can be used with two
  1114. transfer character sets, LATIN1 and CYRILLIC for a total of 24 translation
  1115. functions.
  1116.  
  1117. <p>
  1118.  
  1119.    When a language is representable in more than one set from Table 1, as are
  1120. English, German, Finnish, Turkish, Greek, Russian, etc., the character set
  1121. highest on the list that adequately represents the language should be used.
  1122. For example, ASCII should be used for English.  Within the ISO 8859 family,
  1123. lower-numbered sets that contain all the characters of interest are preferred
  1124. to higher-numbered sets containing the same characters.
  1125.  
  1126. <p>
  1127.  
  1128.    This guideline maximizes the chance that any two particular Kermit programs
  1129. will interoperate.  For example, LATIN1 would be chosen for French, German,
  1130. Italian, Spanish, Danish, Dutch, Swedish, etc; LATIN3 for Turkish;
  1131. JAPANESE-EUC for Japanese text that includes Kanji characters, KATAKANA for
  1132. Japanese text that includes only Roman and Katakana characters, and so on.
  1133.  
  1134. <p>
  1135.  
  1136.    If a file containing a mixture of languages, say English, Finnish, and
  1137. Latvian, must be transferred, the user must find a transfer character set that
  1138. can adequately represent all three languages, in this case Latin Alphabet 4.
  1139. For a mixture of Norwegian and Turkish, Latin-5 must be used, and so on.
  1140.  
  1141. <p>
  1142.  
  1143.    The user can employ this flexibility to achieve useful effects.  For
  1144. example, since there is no requirement that a Cyrillic file be transferred
  1145. using a Cyrillic transfer character set, the user can transliterate between
  1146. Cyrillic and Roman characters as part of the file transfer process.
  1147.  
  1148. <h4>The Translation Function</h4>
  1149.  
  1150. <p>
  1151.  
  1152. A typical Kermit program contains an <i>m</i> × <i>n</i> × 2
  1153. matrix of translation functions, where <i>m</i> is the number of supported
  1154. file character sets, <i>n</i> is the number of supported transfer character
  1155. sets (including the <i>transparent</i> set, which indicates that no
  1156. translation is to be done), and there are two tables for each combination, one
  1157. for sending and one for receiving.  The translation function is selected when
  1158. the user identifies the file and transfer character sets and then sends or
  1159. receives a file.
  1160.  
  1161. <p>
  1162.  
  1163. The normal behavior of a particular function can be altered in several
  1164. ways.  The user can override its default translation goal, and when the goal
  1165. is readability (as it must be when translating from a larger to a smaller
  1166. set), language-specific rules can be invoked.
  1167.  
  1168. <p>
  1169.  
  1170. The function itself can work by any combination of algorithm, translation
  1171. table, exception list, and shameless tricks.  For example, an invertible
  1172. translation between IBM Code Page 437 and Latin Alphabet 1 would be a simple
  1173. indexing operation into a table, but a translation from Japanese EUC to the PC
  1174. "Shift JIS" code is normally accomplished by a tableless algorithm.
  1175. Translation from Latin-1 to ASCII with German language rules could be done
  1176. with a combination of table accesses and exception lists.  To accomplish the
  1177. desired translation, each Kermit program needs to know:
  1178.  
  1179. <p>
  1180. <ul>
  1181.  
  1182. <li>The local file character set.
  1183.  
  1184. <li>The transfer character set to be used.
  1185.  
  1186. <li>The translation goal, invertibility or readability.
  1187.  
  1188. <li>For readable translations, optionally, the language and a corresponding 
  1189. set of language-specific rules.
  1190.  
  1191. </ul>
  1192. <p>
  1193.  
  1194. In most situations, some or all of these are implicit, and no particular
  1195. efforts are required.  To illustrate, suppose that you have an IBM PC on your
  1196. desk, and the PC is connected to a Hewlett Packard (HP) timesharing computer.
  1197. The PC uses IBM code page 850 and the timesharing computer uses the HP Roman8
  1198. Set.  In that case, your PC's file character set is always CP850, the
  1199. timesharing computer's file character set is always HP Roman8, and the
  1200. transfer character set is always Latin-1.  These items can be set in your
  1201. Kermit profiles, and the appropriate translations will always occur
  1202. automatically.
  1203.  
  1204. <p>
  1205.  
  1206.    On the other hand, suppose you must occasionally write some text in German
  1207. and send it from your PC to another computer that supports only ASCII.  In
  1208. this case you would override your Kermit profiles by specifying a transfer
  1209. character set of ASCII, which automatically activates the readability goal,
  1210. and you might also choose to elect language-specific rules for German.
  1211.  
  1212. <p>
  1213. <blockquote>
  1214. <b>Table 1:</b>  Kermit Transfer Character Sets
  1215. <table border>
  1216.  
  1217. <tr>
  1218. <th>Kermit Name</th>
  1219. <th>Standard</th>
  1220. <th>ISO Registration Number</th>
  1221. <th>Kermit Designator</th>
  1222. <th>Languages</th>
  1223.  
  1224. <tr>
  1225. <td>ASCII 
  1226. <td>ANSI X3.4
  1227. <td align="center">6
  1228. <td align="center">(none)
  1229. <td>English, Latin
  1230.  
  1231. <tr>
  1232. <td>LATIN1 
  1233. <td>ISO 8859-1
  1234. <td align="center">100
  1235. <td align="center">I6/100
  1236. <td>Danish, Dutch, English, Faeroese, Finnish, French, German, Icelandic,
  1237. Irish, Italian, Norwegian, Portuguese, Spanish, and Swedish.
  1238.  
  1239. <tr>
  1240. <td>LATIN2 
  1241. <td>ISO 8859-2
  1242. <td align="center">101
  1243. <td align="center">I6/101
  1244. <td>Albanian, Czech, English, German, Hungarian, Polish, Romanian, Croatian,
  1245. Slovak, and Slovene.
  1246.  
  1247. <tr>
  1248. <td>LATIN3 
  1249. <td>ISO 8859-3
  1250. <td align="center">109
  1251. <td align="center">I6/109
  1252. <td>Afrikaans, Catalan, Dutch, English, Esperanto, French, Galician, German,
  1253. Italian, Maltese, Spanish, and Turkish.
  1254.  
  1255. <tr>
  1256. <td>LATIN4 
  1257. <td>ISO 8859-4
  1258. <td align="center">110
  1259. <td align="center">I6/110
  1260. <td>Danish, English, Estonian, Finnish, German, Greenlandic, Sami, Latvian,
  1261. Lithuanian, Norwegian, and Swedish.
  1262.  
  1263. <tr>
  1264. <td>LATIN5 
  1265. <td>ISO 8859-9
  1266. <td align="center">148
  1267. <td align="center">I6/148
  1268. <td>Danish, Dutch, English, Faeroese, Finnish, French, German, Irish, Italian,
  1269. Norwegian Portuguese, Spanish, Swedish, and Turkish.
  1270.  
  1271. <tr>
  1272. <td>CYRILLIC 
  1273. <td>ISO 8859-5
  1274. <td align="center">144
  1275. <td align="center">I6/144
  1276. <td>Bulgarian, Belorussian, English, Macedonian, Russian, Serbocroatian
  1277. (Serbian), Ukrainian.
  1278.  
  1279. <tr>
  1280. <td>ARABIC 
  1281. <td>ISO 8859-6
  1282. <td align="center">127
  1283. <td align="center">I6/127
  1284. <td>Arabic
  1285.  
  1286. <tr>
  1287. <td>GREEK 
  1288. <td>ISO 8859-7
  1289. <td align="center">126
  1290. <td align="center">I6/126
  1291. <td>Greek
  1292.  
  1293. <tr>
  1294. <td>HEBREW 
  1295. <td>ISO 8859-8
  1296. <td align="center">138
  1297. <td align="center">I6/138
  1298. <td>Hebrew
  1299.  
  1300. <tr>
  1301. <td>KATAKANA 
  1302. <td>JIS X 0201
  1303. <td align="center">14, 13
  1304. <td align="center">I14/13
  1305. <td>Japanese (Roman and Katakana)
  1306.  
  1307. <tr>
  1308. <td>JAPANESE-EUC
  1309. <td>JIS X 0201,<br>JIS X 0208
  1310. <td align="center">14, 13, 87
  1311. <td align="center">I14/87/13
  1312. <td> Japanese (Roman, Katakana, Hiragana, Kanji), English, Greek, Russian.
  1313.  
  1314. <tr>
  1315. <td>CHINESE 
  1316. <td>CS GB 2312-80
  1317. <td align="center">58
  1318. <td align="center">I55/58
  1319. <td>Chinese (Roman, Phonetic, and Hanzi), Japanese (Roman, Katakana,
  1320. Hiragana), English, Greek, Russian
  1321.  
  1322. <tr>
  1323. <td>KOREAN 
  1324. <td>KS C 5601
  1325. <td align="center">149
  1326. <td align="center">I6/149
  1327. <td>Korean (Hangul, Hanja), Japanese (Roman, Katakana, Hiragana), Greek,
  1328. Russian, English, and others
  1329.  
  1330. <tr>
  1331. <td>VIETNAMESE 
  1332. <td>TCVN 5712
  1333. <td align="center">180
  1334. <td align="center">I6/180
  1335. <td>Vietnamese
  1336. </table>
  1337. </blockquote>
  1338. <p>
  1339. <blockquote>
  1340. <i>
  1341.  
  1342. UPDATE: After this paper was written, Unicode UCS-2 (Big Endian) and UTF-8
  1343. were added as transfer character sets.  The designator for UCS-2 is I162; the
  1344. designator for UTF-8 is I190.  UTF-8 can be used to convert between any two
  1345. known character sets, but the overhead can be higher than using a
  1346. script-specific transfer character set.  For example, using ISO 8859-5
  1347. as the TCS for Cyrillic text transfer does not expand the data at all, whereas
  1348. UTF-8 doubles its size.
  1349.  
  1350. </i>
  1351. </blockquote>
  1352.  
  1353. <h4>Examples</h4>
  1354.  
  1355. Let's look at a few of many possible translation scenarios.  Each one presents
  1356. its own set of problems requiring decisions by the creator of the translation
  1357. function, or by the user.
  1358.  
  1359. <p>
  1360. <ol>
  1361.  
  1362. <li>From a 7-bit set to a different 7-bit set, e.g. from the Spanish version
  1363. of ISO 646 to ASCII (or vice versa).  The two sets do not contain the same
  1364. characters.  Here we must choose between readability (R) and invertibility
  1365. (I).  To achieve readability in the Spanish-to-ASCII direction, we strip
  1366. diacritical marks (n-tilde becomes simply n, and so on).  To achieve
  1367. invertibility, we make no translation at all.
  1368.  
  1369. <p>
  1370.  
  1371. <li>From a 7-bit set to an 8-bit set.  The 7-bit sets are usually ASCII or an
  1372. ISO 646 national version.  Often, all the characters from the 7-bit set
  1373. are also present in the 8-bit set, and there is no R-versus-I conflict.
  1374. For example: ASCII (and most ISO 646 national variants) to Latin-1 —
  1375. here we satisfy both R and I. In other cases we must choose between R and
  1376. I. For example: the ISO 646 Italian national variant to ISO Latin /
  1377. Arabic: here we either remove the accents for readability, or map the
  1378. accented characters into right-half characters for invertibility.
  1379.  
  1380. <p>
  1381.  
  1382. <li>From an 8-bit set to another 8-bit set.  A common case is converting
  1383. between one of the corporate "extended ASCII" sets (Digital, IBM, HP,
  1384. Apple, NeXT, Data General) and ISO Latin-1.  The two sets share a large
  1385. percentage of common characters.  How do we handle the characters that
  1386. differ?  Again, we must choose between R and I. To complicate matters, the
  1387. IBM, Apple, and NeXT sets use the forbidden C1 control-character area for
  1388. graphic characters.  To create an invertible translation in the absence
  1389. of an official corporate standard, we use the Simple Rule.
  1390.  
  1391. <p>
  1392.  
  1393. <li>From an 8-bit set to a 7-bit set.  For example, from Latin-1 to ASCII or
  1394. to an ISO 646 national set.  Here we are forced to accept a large amount
  1395. of information loss.  We cannot possibly achieve invertibility, so we aim
  1396. for maximum readability, for example by removing diacritics or invoking
  1397. language-specific rules.
  1398.  
  1399. <p>
  1400.  
  1401. <li>From a single-byte character set to a multibyte character set.  Most
  1402. multibyte character sets include ASCII and sometimes several other alphabets
  1403. (such as Greek and Cyrillic).  Here we translate each character into its
  1404. equivalent, if it has one.  When it doesn't, we must choose between R and
  1405. I. For example, "├û" is not found in JIS X 0208 so it can be mapped to
  1406. "O" for readability, or some unique value (preferably one unassigned in JIS X
  1407. 0208) for invertibility.
  1408.  
  1409. <p>
  1410.  
  1411. <li>From a multibyte set to a single-byte set, for example Japanese JIS X
  1412. 0208 into Latin-1 (or Latin/Cyrillic, Latin/Greek, or even ASCII).  An
  1413. invertible translation is clearly impossible.  A readable translation
  1414. would require rendering Kanji ideograms phonetically or translating them
  1415. into an entirely different language, clearly beyond the scope of a
  1416. character-set conversion scheme.
  1417.  
  1418. <p>
  1419.  
  1420. <li>From one national multibyte set to another.  These sets are for Chinese,
  1421. Japanese, and Korean, and have a very large number of characters —
  1422. ideograms, ASCII graphics, Greek, and Cyrillic characters — in common.
  1423. They also have large blocks of unassigned character positions, so the
  1424. characters they do not share in common (such as the Chinese phonetic
  1425. symbols that are absent from the standard Japanese set) can be assigned
  1426. to these areas to preserve invertibility.
  1427.  
  1428. </ol>
  1429. <p>
  1430.  
  1431. No two programmers are likely make the same decisions and this will lead to
  1432. inconsistent translations (unless the Simple Rule is followed).  This
  1433. emphasizes the need for officially published translations between the private
  1434. and standard sets.  And as this list suggests, we also need translations
  1435. between some of the standard sets themselves, for example Chinese and Korean.
  1436. This need is addressed to some extent by the Unicode books <a
  1437. href="#refs">[27]</a>, which include the mappings from various character sets
  1438. to the Unicode set.
  1439.  
  1440. <h4>Performance</h4>
  1441.  
  1442. Character-set translation in itself does not affect the performance of the
  1443. Kermit file transfer protocol to any significant degree.  The introduction of
  1444. per-character translation introduces an extra table access or function call
  1445. but the extra work is usually minimal.  In general, the bottlenecks are
  1446. elsewhere.
  1447.  
  1448. <p>
  1449.  
  1450.    One of the strong points of the Kermit protocol is its ability to transfer
  1451. 8-bit data in the 7-bit communication environment.  This is done using a
  1452. single shift, or prefixing, technique in which each 8-bit character is
  1453. stripped of its 8th bit and then prefixed by a special shift-indicating
  1454. character.  This results in negligible overhead for English and Western
  1455. European text (such as French, German, Italian).
  1456.  
  1457. <p>
  1458.  
  1459.    But for text in "right-handed" languages like Russian, Greek, Hebrew, and
  1460. Arabic, where text characters come predominantly from the right half of the
  1461. character set, single shifts can result in up to 80% overhead.  The situation
  1462. is even worse for Japanese EUC, in which all Kanji bytes have their 8th bits
  1463. set to 1, resulting in transmission overhead of 100% for pure Kanji text on a
  1464. 7-bit connection.
  1465.  
  1466. <p>
  1467.  
  1468.    Because 7-bit communication is still prevalent, Kermit's support for Greek,
  1469. Cyrillic, Hebrew, Arabic, and Japanese text file transfer calls for a more
  1470. efficient technique.  This was accomplished by adding a locking shift
  1471. mechanism to the Kermit protocol, allowing sequences of 8-bit characters to be
  1472. transmitted in 7-bit form with shifting overhead applying to entire 8-bit
  1473. sequences, rather than to each 8-bit character.  Isolated 8-bit characters can
  1474. still be transmitted using single shifts.  These methods are very similar to
  1475. those of ISO 2022, but without the risk of "loss-of-state" due to corruption
  1476. or loss of the shift characters, and with the addition of the "single-shift-1"
  1477. mechanism lacking from ISO 2022.  A combination of single and locking shifts
  1478. can achieve maximum efficiency by using a lookahead technique.  A detailed
  1479. specification is given elsewhere <a href="#refs">[12]</a>.
  1480.  
  1481. <p>
  1482.  
  1483.    The addition of locking shifts to the Kermit protocol increases the
  1484. transfer efficiency on 7-bit connections for typical Cyrillic text by about
  1485. 50% and for typical Kanji text by more than 90%, bringing these transfers to
  1486. within the efficiency range of normal 7-bit ASCII transfers on the same
  1487. connections.
  1488.  
  1489. <hr>
  1490. <h3>CONCLUSIONS AND RECOMMENDATIONS</h3>
  1491.  
  1492. File transfer character-set translation is an optional feature for Kermit
  1493. programs, and is designed to interoperate (with, of course, no claim to
  1494. correct translation) with Kermit programs that do not support it.  As of this
  1495. writing, translation of (at least) Roman, Cyrillic, Hebrew, and Japanese text
  1496. is supported by MS-DOS Kermit for the IBM PC <a href="#refs">[9]</a>, IBM
  1497. mainframe Kermit for VM, MVS, and CICS <a href="#refs">[3]</a>, and C-Kermit
  1498. for UNIX, VMS, OS/2, and other operating systems <a href="#refs">[6]</a>.
  1499. Three basic commands were added to these programs to select the file and
  1500. transfer character sets and any desired language-specific translation rules.
  1501. Locking shifts are used automatically in the 7-bit communication environment
  1502. to prevent Kermit from discriminating against "right-handed" character sets.
  1503. Kermit programs equipped with the new translation features have become popular
  1504. in Europe, Latin America, the former Soviet Union, and Japan.  Work is in
  1505. progress to add further translation capabilities for other parts of the world.
  1506.  
  1507. <p>
  1508.  
  1509.    Space has not permitted discussion of the details of the Kermit protocol,
  1510. the forms of the commands, translation negotiation and refusal mechanisms,
  1511. unilateral and local translation features, automatic matching of file and
  1512. transfer character sets, character sets in terminal emulation, and numerous
  1513. other issues.  These will be covered in a future edition of reference <a
  1514. href="#refs">[5]</a>.
  1515.  
  1516. <p>
  1517.  
  1518.    In the discussions that resulted in the character-set translation
  1519. extension to Kermit, the most fundamental lesson we have learned is that if
  1520. existing standards can solve a particular problem, they should be used
  1521. instead of inventing new techniques to solve the same problem.  Applying this
  1522. lesson to Kermit file transfer results in the following conclusions:
  1523.  
  1524. <p>
  1525. <ol>
  1526.  
  1527. <li>Only ISO-registered standard character sets should be used for
  1528. interchange.  This eliminates the need for any computer to support any
  1529. character sets except its own and the corresponding well-known standards.
  1530.  
  1531. <p>
  1532.  
  1533. <li>The sender should identify the transfer character set to the receiver
  1534. using a standard notation such as its ISO registration number.  This
  1535. eliminates the need for setting up separate and redundant registration
  1536. authoritities for character-set identifiers.
  1537.  
  1538. <p>
  1539.  
  1540. <li>Translations should be invertible, readable, and consistent.  When all
  1541. three of these goals cannot be achieved by a single translation, the user
  1542. should be able to choose the translation goal.
  1543.  
  1544. </ol>
  1545. <p>
  1546.  
  1547. These principles can be applied to any form of textual data interchange,
  1548. including electronic mail, network file systems, terminal emulation, virtual
  1549. terminal service, distributed databases, remote procedure calls, cutting and
  1550. pasting among object-oriented applications, and so on.
  1551.  
  1552. <p>
  1553.  
  1554.    The translation process itself, however, remains ill-defined.  It is hoped
  1555. that the industry and the standards organizations will take the following
  1556. steps:
  1557.  
  1558. <p>
  1559. <ol>
  1560.  
  1561. <li>Standard character sets should be used in preference to private character
  1562. sets.
  1563.  
  1564. <p>
  1565.  
  1566. <li>Owners of private character sets should publish official invertible
  1567. translations to ISO-registered standard sets.  In the absence of official
  1568. translations, a simple procedure such as the one presented in this paper
  1569. should be used to achieve consistent invertible translations across all
  1570. applications.
  1571.  
  1572. <p>
  1573.  
  1574. <li>Standards organizations are encouraged to consider publishing
  1575. translations between different standard character sets, such as the
  1576. Japanese, Chinese, and Korean sets, as well as readable transliterations
  1577. among different alphabetic writing systems, such as Roman, Greek, Hebrew,
  1578. Arabic, and Cyrillic.
  1579.  
  1580. <p>
  1581.  
  1582. <li>Operating system designers should consider tagging plain-text files with
  1583. character-set identifiers, like the Kermit tags listed in Table 1, to
  1584. allow applications software to determine a file's character set
  1585. automatically.  When standard character sets are used, their tags should
  1586. be consistent across different operating systems.
  1587.  
  1588. </ol>
  1589. <p>
  1590.  
  1591.    Ten or twenty years from now, perhaps all the computers, as well as all the
  1592. display, entry, printing, and telcommunication devices of the world will use
  1593. one universal character set, and the issues discussed in this paper will be
  1594. irrelevant.  On the other hand, perhaps the accumulated and ever-growing
  1595. installed base of existing hardware, software, and electronic information will
  1596. prove too massive for conversion and the universal character set will be just
  1597. one more character set on the list.
  1598.  
  1599. <h4>ACKNOWLEDGEMENTS</h4>
  1600.  
  1601. My deepest thanks to Christine M. Gianone of Columbia University for inspiring
  1602. the work and ideas described in this paper, and for her key contributions
  1603. thereto.  Special thanks also to the others who played prominent roles in the
  1604. design and development of Kermit's character-set translation capabilities: Joe
  1605. R. Doupnik of Utah State University, John Chandler of the Harvard /
  1606. Smithsonian Center for Astrophysics, Hirofumi Fujii of the Japan National
  1607. Laboratory of High Energy Physics in Tokyo, John Klensin of the United Nations
  1608. University, Andre Pirard of the University of Liege in Belgium, Johan van
  1609. Wingen of the Netherlands and numerous ISO committees, Gisbert W. Selke of the
  1610. Wissenschaftliches Institut der Ortskrankenkassen in Bonn, Germany, and
  1611. Konstantin Vinogradov of the International Centre for Scientific and Technical
  1612. Information (ICSTI) in Moscow.  Grateful acknowledgements also to Juri
  1613. Gornostaev and A. Butrimenko of ICSTI for hosting the First International
  1614. Kermit Conference in Moscow <a href="#refs">[11]</a> in Spring 1989, where the
  1615. ideas in this paper received their first public hearing.  Thanks also to the
  1616. many participants in the ISO8859, UNICODE, and ISO10646 network discussion
  1617. groups for valuable information and insights.
  1618.  
  1619. <h4>ABOUT THE AUTHOR</h4>
  1620.  
  1621. FRANK DA CRUZ is Manager of Communication Software Development at Columbia
  1622. University, author of the book <cite>Kermit, A File Transfer Protocol</cite>,
  1623. co-author (with Christine M. Gianone) of the book <cite>Using C-Kermit</cite>,
  1624. leader of the team that developed the Kermit protocol, and principal author of
  1625. several Kermit software programs including C-Kermit.
  1626. Present address: Columbia University, 612 West 115th Street, New York, NY
  1627. 10025, USA; Email: fdc@columbia.edu.
  1628.  
  1629.  
  1630. <h4><a name="refs">REFERENCES</a></h4>
  1631.  
  1632. <ol>
  1633.  
  1634. <li><cite>ANSI X3.4-1986, Code for Information Interchange</cite>.  American
  1635. National Standards Institute, 1986.  The ASCII specification; the US version
  1636. of ISO 646.
  1637.  
  1638. <p>
  1639.  
  1640. <li><cite>CCITT Recommendation T.61, Character Repertoire and Coded Character
  1641. Sets for the International Teletex Service</cite>.  CCITT, Geneva, 1980
  1642. (amended 1984).
  1643.  
  1644. <p>
  1645.  
  1646. <li>Chandler, John. <cite>IBM System/370 Kermit User's Guide</cite>.  Columbia
  1647. University Academic Information Systems, 1993.  Available in separate versions
  1648. for VM/CMS, MVS/TSO, and CICS.
  1649.  
  1650. <p>
  1651.  
  1652. <li><cite>Chinese Standard GB 2312-80, Coded Chinese Graphic Character Set for
  1653. Information Interchange</cite>.  China Association for Standardization,
  1654. Beijing, 1980.
  1655.  
  1656. <p>
  1657.  
  1658. <li>da Cruz, Frank.  <cite>Kermit, A File Transfer Protocol</cite>.  Digital
  1659. Press, Bedford, MA, 1987.
  1660.  
  1661. <p>
  1662.  
  1663. <li>da Cruz, Frank and Christine Gianone.  <cite>Using C-Kermit</cite>.
  1664. Digital Press, Burlington, MA, 1993.  EY-J896E-DP.  Also available in German.
  1665. <i>UPDATE: 2nd Edition published 1997</i>.
  1666.  
  1667. <p>
  1668.  
  1669. <li>Data General. <cite>Programming the Display Terminal: Models D217, D413,
  1670. and D463</cite>.  Data General, Westboro, MA, 1991.  014-002111-00.
  1671.  
  1672. <p>
  1673.  
  1674. <li>─Éß╗ù, James, Ngô Thanh Nhàn, Hoang Nguyen.
  1675. "A proposal for Vietnamese character encoding standards in a unified text
  1676. processing framework".  <cite>Computer Standards & Interfaces</cite> 14
  1677. (1992).
  1678.  
  1679. <p>
  1680.  
  1681. <li>Gianone, Christine M.  <cite>Using MS-DOS Kermit</cite>.  Digital Press,
  1682. Burlington, MA, 1992.  EY-H893E-DP, Also available in French and German
  1683. editions.
  1684.  
  1685. <p>
  1686.  
  1687. <li>Gianone, Christine M.  "Have Kermit, Will Travel".  <cite>Kermit
  1688. News</cite> 3, 1 (June 1988).
  1689.  
  1690. <p>
  1691.  
  1692. <li>Gianone, Christine M.  "Mission to Moscow".  <cite>Kermit News</cite>,
  1693. 4 (June 1990).
  1694.  
  1695. <p>
  1696.  
  1697. <li>Gianone, Christine M. and Frank da Cruz.  <cite>A Locking Shift Mechanism
  1698. for the Kermit File Transfer Protocol</cite>.  Columbia University, 1991.
  1699.  
  1700. <p>
  1701.  
  1702. <li><cite>IBM Character Data Representation Architecture, Level 1
  1703. Registry</cite>.  IBM Canada Ltd., National Language Technical Centre,
  1704. Ontario, 1990.  SC09-1391-00.
  1705.  
  1706. <p>
  1707.  
  1708. <li><cite>ISO Standard 646, 7-Bit Coded Character Set for Information
  1709. Processing Interchange</cite>.  Second edition, International Organization for
  1710. Standardization, 1983.  Also available as ECMA-6, and similar to CCITT T.50.
  1711.  
  1712. <p>
  1713.  
  1714. <li><cite>ISO International Standard 2022, Information processing — ISO 7-bit
  1715. and 8-bit coded character sets — Code extension techniques</cite>.  Third
  1716. edition, International Organization for Standardization, 1986.  Also available
  1717. as ECMA-35.
  1718.  
  1719. <p>
  1720.  
  1721. <li><cite>ISO International Standard ISO 2375, Information processing —
  1722. Procedure for Registration of Escape Sequences</cite>.  International
  1723. Organization for Standardization, 1985.
  1724.  
  1725. <p>
  1726.  
  1727. <li><cite>ISO International Standard 4873, Information processing — ISO 8-bit
  1728. code for information interchange — Structure and rules for
  1729. implementation</cite>.  Second edition, International Organization for
  1730. Standardization, 1986.  Also available as ECMA-43.
  1731.  
  1732. <p>
  1733.  
  1734. <li><cite>ISO International Standard 8859 Parts 1 through 9, Information
  1735. Processing — 8-Bit Single-Byte Coded Graphic Character Sets</cite>.
  1736. International Organization for Standardization, 1987-.  ISO 8859-1 through -4
  1737. are the Latin Alphabets 1 through 4, also available as ECMA-94.  ISO 8859-5 is
  1738. the Latin/Cyrillic Alphabet (ECMA 113).
  1739.  
  1740. <p>
  1741.  
  1742. <li><cite>ISO/IEC 10646-1, International Standard 10646, Information
  1743. Technology — Universal Multiple-Octet Coded Character Set (UCS)</cite>.
  1744. ISO/IEC JTC1, 1993.
  1745.  
  1746. <p>
  1747.  
  1748. <li><cite>ISO International Standard 6429, Information processing — C1
  1749. Control Character Set of ISO 6429</cite>.  International Organization for
  1750. Standardization, 1983.
  1751.  
  1752. <p>
  1753.  
  1754. <li><cite>ISO International Register of Coded Characters to Be Used with
  1755. Escape Sequences</cite>.  European Computer Manufacturers Association (ECMA),
  1756. 1990, updated periodically.
  1757.  
  1758. <p>
  1759.  
  1760. <li><cite>JIS X 0201, The Japanese Katakana and Roman Set of
  1761. Characters</cite>.  Japan Industrial Standards Committee, 1969.
  1762.  
  1763. <p>
  1764.  
  1765. <li><cite>JIS X 0208, The Japanese Graphic Character Set for Information
  1766. Interchange</cite>.  Japan Industrial Standards Committee, 1983.
  1767.  
  1768. <p>
  1769.  
  1770. <li><cite>JIS X 0212, Supplementary Japanese Graphic Character Set for
  1771. Information Interchange</cite>.  Japan National Committee on ISO/IEC JTC1/SC2,
  1772. 1991.
  1773.  
  1774. <p>
  1775.  
  1776. <li><cite>Korean Standard KS C 5601-1987, Korean Graphic Character Set for
  1777. Information Interchange</cite>.  Korea Bureau of Standards, 1987.
  1778.  
  1779. <p>
  1780.  
  1781. <li>Padlipsky, M. A.  <cite>The Elements of Networking Style</cite>.  Prentice
  1782. Hall, 1985.
  1783.  
  1784. <p>
  1785.  
  1786. <li>The Unicode Consortium.  <cite>The Unicode Standard, Worldwide Character
  1787. Encoding, Version 1.0</cite>.  Addison-Wesley Publishing Company, Volume 1,
  1788. 1991; Volume 2, 1992.
  1789.  
  1790. <p>
  1791.  
  1792. <li>Viet Nam General Department for Standardization. <cite>Vietnamese National
  1793. Standard TCVN 5712, 8-bit Vietnamese Standard Code for Information Interchange
  1794. (VSCII)</cite>.  Viet Nam State Committee for Sciences, 1993.
  1795.  
  1796. </ol>
  1797. <p>
  1798.  
  1799. (End)
  1800. </body></html>
  1801.