utf8.h
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:10k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: UTF-8 routines
  3.  *
  4.  * Author: Mark Crispin
  5.  * Networks and Distributed Computing
  6.  * Computing & Communications
  7.  * University of Washington
  8.  * Administration Building, AG-44
  9.  * Seattle, WA  98195
  10.  * Internet: MRC@CAC.Washington.EDU
  11.  *
  12.  * Date: 11 June 1997
  13.  * Last Edited: 15 September 1999
  14.  *
  15.  * Copyright 1999 by the University of Washington
  16.  *
  17.  *  Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose and without fee is hereby granted, provided
  19.  * that the above copyright notices appear in all copies and that both the
  20.  * above copyright notices and this permission notice appear in supporting
  21.  * documentation, and that the name of the University of Washington not be
  22.  * used in advertising or publicity pertaining to distribution of the software
  23.  * without specific, written prior permission.  This software is made
  24.  * available "as is", and
  25.  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
  26.  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
  27.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
  28.  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
  29.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
  30.  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
  31.  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN
  32.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33.  *
  34.  */
  35. /* UTF-8 size and conversion routines from UCS-2 values.  This will need to
  36.  * be changed if UTF-16 data (surrogate pairs) are ever an issue.
  37.  */
  38. #define UTF8_SIZE(c) ((c & 0xff80) ? ((c & 0xf800) ? 3 : 2) : 1)
  39. #define UTF8_PUT(b,c) {
  40.   if (c & 0xff80) { /* non-ASCII? */
  41.     if (c & 0xf800) { /* three byte code */
  42.       *b++ = 0xe0 | (c >> 12);
  43.       *b++ = 0x80 | ((c >> 6) & 0x3f);
  44.     }
  45.     else *b++ = 0xc0 | ((c >> 6) & 0x3f);
  46.     *b++ = 0x80 | (c & 0x3f); 
  47.   }
  48.   else *b++ = c;
  49. }
  50. /* ISO-2022 engine states */
  51. #define I2S_CHAR 0 /* character */
  52. #define I2S_ESC 1 /* previous character was ESC */
  53. #define I2S_MUL 2 /* previous character was multi-byte code */
  54. #define I2S_INT 3 /* previous character was intermediate */
  55. /* ISO-2022 Gn selections */
  56. #define I2C_G0 0 /* G0 */
  57. #define I2C_G1 1 /* G1 */
  58. #define I2C_G2 2 /* G2 */
  59. #define I2C_G3 3 /* G3 */
  60. #define I2C_SG2 (2 << 2) /* single shift G2 */
  61. #define I2C_SG3 (3 << 2) /* single shift G2 */
  62. /* ISO-2022 octet definitions */
  63. #define I2C_ESC 0x1b /* ESCape */
  64. /* Intermediate character */
  65. #define I2C_STRUCTURE 0x20 /* announce code structure */
  66. #define I2C_C0 0x21 /* C0 */
  67. #define I2C_C1 0x22 /* C1 */
  68. #define I2C_CONTROL 0x23 /* single control function */
  69. #define I2C_MULTI 0x24 /* multi-byte character set */
  70. #define I2C_OTHER 0x25 /* other coding system */
  71. #define I2C_REVISED 0x26 /* revised registration */
  72. #define I2C_G0_94 0x28 /* G0 94-character set */
  73. #define I2C_G1_94 0x29 /* G1 94-character set */
  74. #define I2C_G2_94 0x2A /* G2 94-character set */
  75. #define I2C_G3_94 0x2B /* G3 94-character set */
  76. #define I2C_G0_96 0x2C /* (not in ISO-2022) G0 96-character set */
  77. #define I2C_G1_96 0x2D /* G1 96-character set */
  78. #define I2C_G2_96 0x2E /* G2 96-character set */
  79. #define I2C_G3_96 0x2F /* G3 96-character set */
  80. /* Locking shifts */
  81. #define I2C_SI 0x0f /* lock shift to G0 (Shift In) */
  82. #define I2C_SO 0x0e /* lock shift to G1 (Shift Out) */
  83. /* prefixed by ESC */
  84. #define I2C_LS2 0x6e /* lock shift to G2 */
  85. #define I2C_LS3 0x6f /* lock shift to G3 */
  86. #define I2C_LS1R 0x7e /* lock shift GR to G1 */
  87. #define I2C_LS2R 0x7d /* lock shift GR to G2 */
  88. #define I2C_LS3R 0x7c /* lock shift GR to G3 */
  89. /* Single shifts */
  90. #define I2C_SS2_ALT 0x8e /* single shift to G2 (SS2) */
  91. #define I2C_SS3_ALT 0x8f /* single shift to G3 (SS3) */
  92. #define I2C_SS2_ALT_7 0x19 /* single shift to G2 (SS2) */
  93. #define I2C_SS3_ALT_7 0x1d /* single shift to G3 (SS3) */
  94. /* prefixed by ESC */
  95. #define I2C_SS2 0x4e /* single shift to G2 (SS2) */
  96. #define I2C_SS3 0x4f /* single shift to G3 (SS3) */
  97. /* Types of character sets */
  98. #define I2CS_94 0x000 /* 94 character set */
  99. #define I2CS_96 0x100 /* 96 character set */
  100. #define I2CS_MUL 0x200 /* multi-byte */
  101. #define I2CS_94x94 (I2CS_MUL | I2CS_94)
  102. #define I2CS_96x96 (I2CS_MUL | I2CS_96)
  103. /* 94 character sets */
  104. /* British localized ASCII */
  105. #define I2CS_BRITISH (I2CS_94 | 0x41)
  106. /* ASCII */
  107. #define I2CS_ASCII (I2CS_94 | 0x42)
  108. /* some buggy software does this */
  109. #define I2CS_JIS_BUGROM (I2CS_94 | 0x48)
  110. /* JIS X 0201-1976 right half */
  111. #define I2CS_JIS_KANA (I2CS_94 | 0x49)
  112. /* JIS X 0201-1976 left half */
  113. #define I2CS_JIS_ROMAN (I2CS_94 | 0x4a)
  114. /* JIS X 0208-1978 */
  115. #define I2CS_JIS_OLD (I2CS_94x94 | 0x40)
  116. /* GB 2312 */
  117. #define I2CS_GB (I2CS_94x94 | 0x41)
  118. /* JIS X 0208-1983 */
  119. #define I2CS_JIS_NEW (I2CS_94x94 | 0x42)
  120. /* KSC 5601 */
  121. #define I2CS_KSC (I2CS_94x94 | 0x43)
  122. /* JIS X 0212-1990 */
  123. #define I2CS_JIS_EXT (I2CS_94x94 | 0x44)
  124. /* CNS 11643 plane 1 */
  125. #define I2CS_CNS1 (I2CS_94x94 | 0x47)
  126. /* CNS 11643 plane 2 */
  127. #define I2CS_CNS2 (I2CS_94x94 | 0x48)
  128. /* CNS 11643 plane 3 */
  129. #define I2CS_CNS3 (I2CS_94x94 | 0x49)
  130. /* CNS 11643 plane 4 */
  131. #define I2CS_CNS4 (I2CS_94x94 | 0x4a)
  132. /* CNS 11643 plane 5 */
  133. #define I2CS_CNS5 (I2CS_94x94 | 0x4b)
  134. /* CNS 11643 plane 6 */
  135. #define I2CS_CNS6 (I2CS_94x94 | 0x4c)
  136. /* CNS 11643 plane 7 */
  137. #define I2CS_CNS7 (I2CS_94x94 | 0x4d)
  138. /* 96 character sets */
  139. /* Latin-1 (Western Europe) */
  140. #define I2CS_ISO8859_1 (I2CS_96 | 0x41)
  141. /* Latin-2 (Czech, Slovak) */
  142. #define I2CS_ISO8859_2 (I2CS_96 | 0x42)
  143. /* Latin-3 (Dutch, Turkish) */
  144. #define I2CS_ISO8859_3 (I2CS_96 | 0x43)
  145. /* Latin-4 (Scandinavian) */
  146. #define I2CS_ISO8859_4 (I2CS_96 | 0x44)
  147. /* Greek */
  148. #define I2CS_ISO8859_7 (I2CS_96 | 0x46)
  149. /* Arabic */
  150. #define I2CS_ISO8859_6 (I2CS_96 | 0x47)
  151. /* Hebrew */
  152. #define I2CS_ISO8859_8 (I2CS_96 | 0x48)
  153. /* Cyrillic */
  154. #define I2CS_ISO8859_5 (I2CS_96 | 0x4c)
  155. /* Latin-5 (Finnish, Portuguese) */
  156. #define I2CS_ISO8859_9 (I2CS_96 | 0x4d)
  157. /* TIS 620 */
  158. #define I2CS_TIS620 (I2CS_96 | 0x54)
  159. /* Latin-6 (Northern Europe) */
  160. #define I2CS_ISO8859_10 (I2CS_96 | 0x56)
  161. /* Latin-7 (Baltic) */
  162. #define I2CS_ISO8859_13 (I2CS_96 | 0x59)
  163. /* Vietnamese */
  164. #define I2CS_VSCII (I2CS_96 | 0x5a)
  165. /* Latin-8 (Celtic) */
  166. #define I2CS_ISO8859_14 (I2CS_96 | 0x5c)
  167. /* Euro (6/2 may be incorrect) */
  168. #define I2CS_ISO8859_15 (I2CS_96 | 0x62)
  169. /* Miscellaneous ISO 2022 definitions */
  170. #define EUC_CS2 0x8e /* single shift CS2 */
  171. #define EUC_CS3 0x8f /* single shift CS3 */
  172. #define BITS7 0x7f /* 7-bit value mask */
  173. #define BIT8 0x80 /* 8th bit mask */
  174. /* UCS2 codepoints */
  175. #define UCS2_POUNDSTERLING 0x00a3
  176. #define UCS2_YEN 0x00a5
  177. #define UCS2_OVERLINE 0x203e
  178. #define UCS2_KATAKANA 0xff61
  179. #define BOGON 0xfffd
  180. /* hankaku katakana parameters */
  181. #define MIN_KANA_7 0x21
  182. #define MAX_KANA_7 0x5f
  183. #define KANA_7 (UCS2_KATAKANA - MIN_KANA_7)
  184. #define MIN_KANA_8 (MIN_KANA_7 | BIT8)
  185. #define MAX_KANA_8 (MAX_KANA_7 | BIT8)
  186. #define KANA_8 (UCS2_KATAKANA - MIN_KANA_8)
  187. /* Charset scripts */
  188. /*  The term "script" is used here in a very loose sense, enough to make
  189.  * purists cringe.  Basically, the idea is to give the main program some
  190.  * idea of how it should treat the characters of text in a charset with
  191.  * respect to font, drawing routines, etc.
  192.  *
  193.  *  In some cases, "script" is associated with a charset; in other cases,
  194.  * it's more closely tied to a language.
  195.  */
  196. #define SC_UNICODE 0x1 /* UNICODE */
  197. /* ISO 8859 scripts */
  198. #define SC_LATIN_1 0x10 /* Western Europe */
  199. #define SC_LATIN_2 0x20 /* Eastern Europe */
  200. #define SC_LATIN_3 0x40 /* Southern Europe */
  201. #define SC_LATIN_4 0x80 /* Northern Europe */
  202. #define SC_LATIN_5 0x100 /* Turkish */
  203. #define SC_LATIN_6 0x200 /* Nordic */
  204. #define SC_LATIN_7 0x400 /* Baltic */
  205. #define SC_LATIN_8 0x800 /* Celtic */
  206. #define SC_LATIN_9 0x1000 /* Euro */
  207. #define SC_LATIN_0 SC_LATIN_9 /* colloquial name for Latin-9 */
  208. #define SC_ARABIC 0x2000
  209. #define SC_CYRILLIC 0x4000
  210. #define SC_GREEK 0x8000
  211. #define SC_HEBREW 0x10000
  212. #define SC_THAI 0x20000
  213. #define SC_UKRANIAN 0x40000
  214. /* East Asian scripts */
  215. #define SC_CHINESE_SIMPLIFIED 0x100000
  216. #define SC_CHINESE_TRADITIONAL 0x200000
  217. #define SC_JAPANESE 0x400000
  218. #define SC_KOREAN 0x800000
  219. #define SC_VIETNAMESE 0x1000000
  220. /* Character set table support */
  221. typedef void (*cstext_t) (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  222. struct utf8_csent {
  223.   char *name; /* charset name */
  224.   cstext_t dsp; /* text conversion dispatch */
  225.   void *tab; /* optional additional data */
  226.   unsigned long script; /* script(s) implemented by this charset */
  227.   char *preferred; /* preferred charset over this one */
  228. };
  229. struct utf8_eucparam {
  230.   unsigned int base_ku : 8; /* base row */
  231.   unsigned int base_ten : 8; /* base column */
  232.   unsigned int max_ku : 8; /* maximum row */
  233.   unsigned int max_ten : 8; /* maximum column */
  234.   void *tab; /* conversion table */
  235. };
  236. /* UTF-7 engine states */
  237. #define U7_ASCII 0 /* ASCII character */
  238. #define U7_PLUS 1 /* plus seen */
  239. #define U7_UNICODE 2 /* Unicode characters */
  240. #define U7_MINUS 3 /* absorbed minus seen */
  241. /* Function prototypes */
  242. long utf8_text (SIZEDTEXT *text,char *charset,SIZEDTEXT *ret,long flags);
  243. void utf8_text_8859_1 (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  244. void utf8_text_1byte (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  245. void utf8_text_1byte8 (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  246. void utf8_text_euc (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  247. void utf8_text_dbyte (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  248. void utf8_text_dbyte2 (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  249. void utf8_text_sjis (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  250. void utf8_text_2022 (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  251. void utf8_text_utf7 (SIZEDTEXT *text,SIZEDTEXT *ret,void *tab);
  252. void utf8_searchpgm (SEARCHPGM *pgm,char *charset);
  253. void utf8_stringlist (STRINGLIST *st,char *charset);
  254. long utf8_mime2text (SIZEDTEXT *src,SIZEDTEXT *dst);
  255. unsigned char *mime2_token (unsigned char *s,unsigned char *se,
  256.     unsigned char **t);
  257. unsigned char *mime2_text (unsigned char *s,unsigned char *se,
  258.    unsigned char **t);
  259. long mime2_decode (unsigned char *e,unsigned char *t,unsigned char *te,
  260.    SIZEDTEXT *txt);