Red Hat Beta(Skipjack)'s XFree86-4.2.0-6.47 is based on James Su's patch, if you have interests.
James Su wrote: > Hi > Here is a patch for XFree86 4.1.0 to support GB18030. I wrote it long > time ago (About June 2001). > > It's only a workable patch, it's far from perfect. > > Regards > James Su > > > Chulkee Sung wrote: > >> Anthony, and >> all gb18030 support interested, >> >> Thanks for your comments. >> >> I seems that support of gb18030 support in glibc level is quite >> solid, of >> course I see many debates. I personally think that our glibc should >> handle >> all code points regardless that they are assigned or not as long as >> that are >> legal. This I believe is worth to continue to discuss. >> >> In X; however, I saw many gb18030 related discussions; however, I did >> not >> see any solid conclusion or finished implementation just by reading mail >> threads in xfree86. >> My questions as follows still remains unresolved. >> >> DISPLAY of gb18030: For gb18030 two- or/and four-byte characters: >> (Xlib 4.1, >> Glibc 2.2.4) >> I can dispplay only after I convert them into utf-8 using iconv and >> using unifont. >> I tried various settings of XLC-LOCALE along with gb18030 fonts, but all >> failed. >> >> Q: How can a gb8030 characters be displayed without conversion with >> gb18030 fonts. >> >> LOCALE SETTING for GB18030: >> Q: Would modification of XLC_LOCLAE and/or fonts' encoding file be >> enough OR >> are there more to do ? >> Q: Are there an official files for XLC_LCOALE, etc. that XFree86.org >> recommend >> for gb18030 support ? >> >> Chulkee, >> >> >> >> ----- Original Message ----- >> From: "Anthony Fok" <[EMAIL PROTECTED]> >> To: <[EMAIL PROTECTED]> >> Sent: Tuesday, March 26, 2002 7:02 AM >> Subject: Re: [I18n]XFree86 4.1 gb188030 support >> >> >>> Hello Chulkee, >>> >>> The questions you asked about GB18030 are probably all addressed >>> already, mainly by James Su and by other developers worldwide. You'll >>> probably need to search on various mailing lists and web sites to find >>> all the details and information. >>> >>> On Mon, Mar 25, 2002 at 10:45:12AM -0700, Chulkee Sung wrote: >>> >>>> GLIBC: >>>> Each time when I use iconv to convert to UTF-8, "invalid gb18030 >>>> >> sequence >> >>>> error", is reported, but when I checked my gb18030 four-byte data, >>>> they >>>> are all in VALID code points, but I wouldn't know if they are all >>>> assigned. >>>> >>> See the discussion at: >>> >>> http://sources.redhat.com/ml/libc-alpha/2002-01/ >>> >>> Scroll down to "January 15, 2002" and read the thread starting with >>> this message: >>> >>> "New GB18030 gconv module contributed by ThizLinux Laboratory" >>> >>> At the time, Ulrich and Yu Shao were not willing to put any >>> legal-but-unassigned codepoints in gb18030.c, and intentionally put >>> NULL in there, hence the "invalid gb18030 sequence" error. Other >>> developers and I weren't able to convince them. If you can convince >>> Ulrich and Yu Shao otherwise, please do. >>> >>> Nevertheless, follow the discussion, and you'll find a link to a >>> gb18030.c (GB18030<->Unicode gconv module) that is actually complete. >>> Make sure you grab the one dated 2002-02-21, which is a few percent >>> faster than the 2002-01-15 versions. >>> >>> Cheers, >>> >>> Anthony >>> >>> -- >>> Anthony Fok Tung-Ling >>> ThizLinux Laboratory <[EMAIL PROTECTED]> http://www.thizlinux.com/ >>> Debian Chinese Project <[EMAIL PROTECTED]> >>> >> http://www.debian.org/intl/zh/ >> >>> Come visit Our Lady of Victory Camp! http://www.olvc.ab.ca/ >>> _______________________________________________ >>> I18n mailing list >>> [EMAIL PROTECTED] >>> http://XFree86.Org/mailman/listinfo/i18n >>> >> >> _______________________________________________ >> I18n mailing list >> [EMAIL PROTECTED] >> http://XFree86.Org/mailman/listinfo/i18n >> >> > > > >------------------------------------------------------------------------ > >diff -urN XFree86-4.1.0/xc/lib/X11/lcUTF8.c XFree86-4.1.0.gb18030/xc/lib/X11/lcUTF8.c >--- XFree86-4.1.0/xc/lib/X11/lcUTF8.c Fri Feb 9 08:02:53 2001 >+++ XFree86-4.1.0.gb18030/xc/lib/X11/lcUTF8.c Wed Jun 20 12:06:31 2001 >@@ -71,6 +71,10 @@ > * without first going through the list of predefined character sets. > */ > >+/* >+ * Modified by James Su <[EMAIL PROTECTED]> to support GB18030 Locale >+ */ >+ > #include <stdio.h> > #include "Xlibint.h" > #include "XlcPubI.h" >@@ -1798,6 +1802,585 @@ > return create_tofontcs_conv(from_lcd, &methods_utf8tocs); > } > >+/* ========================== iconv Stuff ================================ */ >+ >+/* from XlcNCharSet to XlcNMultiByte */ >+ >+static int >+iconv_cstombs(conv, from, from_left, to, to_left, args, num_args) >+ XlcConv conv; >+ XPointer *from; >+ int *from_left; >+ XPointer *to; >+ int *to_left; >+ XPointer *args; >+ int num_args; >+{ >+ XlcCharSet charset; >+ char *name; >+ Utf8Conv convptr; >+ int i; >+ unsigned char const *src; >+ unsigned char const *srcend; >+ unsigned char *dst; >+ unsigned char *dstend; >+ int unconv_num; >+ >+ if (from == NULL || *from == NULL) >+ return 0; >+ >+ if (num_args < 1) >+ return -1; >+ >+ charset = (XlcCharSet) args[0]; >+ name = charset->encoding_name; >+ /* not charset->name because the latter has a ":GL"/":GR" suffix */ >+ >+ for (convptr = all_charsets, i = all_charsets_count-1; i > 0; convptr++, i--) >+ if (!strcmp(convptr->name, name)) >+ break; >+ if (i == 0) >+ return -1; >+ >+ src = (unsigned char const *) *from; >+ srcend = src + *from_left; >+ dst = (unsigned char *) *to; >+ dstend = dst + *to_left; >+ unconv_num = 0; >+ >+ while (src < srcend) { >+ ucs4_t wc; >+ int consumed; >+ int count; >+ >+ consumed = convptr->cstowc(conv, &wc, src, srcend-src); >+ if (consumed == RET_ILSEQ) >+ return -1; >+ if (consumed == RET_TOOFEW(0)) >+ break; >+ >+ /* Use stdc iconv to convert widechar -> multibyte */ >+ >+ count = wctomb(dst, wc); >+ if (count == 0) >+ break; >+ if (count == -1) { >+ count = wctomb(dst, BAD_WCHAR); >+ if (count == 0) >+ break; >+ unconv_num++; >+ } >+ src += consumed; >+ dst += count; >+ } >+ >+ *from = (XPointer) src; >+ *from_left = srcend - src; >+ *to = (XPointer) dst; >+ *to_left = dstend - dst; >+ >+ return unconv_num; >+ >+} >+ >+static XlcConvMethodsRec iconv_cstombs_methods = { >+ close_converter, >+ iconv_cstombs, >+ NULL >+}; >+ >+static XlcConv >+open_iconv_cstombs(from_lcd, from_type, to_lcd, to_type) >+ XLCd from_lcd; >+ char *from_type; >+ XLCd to_lcd; >+ char *to_type; >+{ >+ lazy_init_all_charsets(); >+ return create_conv(from_lcd, &iconv_cstombs_methods); >+} >+ >+static int >+iconv_mbstocs(conv, from, from_left, to, to_left, args, num_args) >+ XlcConv conv; >+ XPointer *from; >+ int *from_left; >+ XPointer *to; >+ int *to_left; >+ XPointer *args; >+ int num_args; >+{ >+ Utf8Conv *preferred_charsets; >+ XlcCharSet last_charset = NULL; >+ unsigned char const *src; >+ unsigned char const *srcend; >+ unsigned char *dst; >+ unsigned char *dstend; >+ int unconv_num; >+ >+ if (from == NULL || *from == NULL) >+ return 0; >+ >+ preferred_charsets = (Utf8Conv *) conv->state; >+ src = (unsigned char const *) *from; >+ srcend = src + *from_left; >+ dst = (unsigned char *) *to; >+ dstend = dst + *to_left; >+ unconv_num = 0; >+ >+ while (src < srcend && dst < dstend) { >+ Utf8Conv chosen_charset = NULL; >+ XlcSide chosen_side = XlcNONE; >+ wchar_t wc; >+ int consumed; >+ int count; >+ >+ /* Uses stdc iconv to convert multibyte -> widechar */ >+ >+ consumed = mbtowc(&wc, src, srcend-src); >+ if (consumed == 0) >+ break; >+ if (consumed == -1) { >+ src++; >+ unconv_num++; >+ continue; >+ } >+ >+ count = charset_wctocs(preferred_charsets, &chosen_charset, &chosen_side, >conv, dst, wc, dstend-dst); >+ >+ if (count == RET_TOOSMALL) >+ break; >+ if (count == RET_ILSEQ) { >+ src += consumed; >+ unconv_num++; >+ continue; >+ } >+ >+ if (last_charset == NULL) { >+ last_charset = >+ _XlcGetCharSetWithSide(chosen_charset->name, chosen_side); >+ if (last_charset == NULL) { >+ src += consumed; >+ unconv_num++; >+ continue; >+ } >+ } else { >+ if (!(last_charset->xrm_encoding_name == chosen_charset->xrm_name >+ && (last_charset->side == XlcGLGR >+ || last_charset->side == chosen_side))) >+ break; >+ } >+ src += consumed; >+ dst += count; >+ } >+ >+ if (last_charset == NULL) >+ return -1; >+ >+ *from = (XPointer) src; >+ *from_left = srcend - src; >+ *to = (XPointer) dst; >+ *to_left = dstend - dst; >+ >+ if (num_args >= 1) >+ *((XlcCharSet *)args[0]) = last_charset; >+ >+ return unconv_num; >+} >+ >+static XlcConvMethodsRec iconv_mbstocs_methods = { >+ close_tocs_converter, >+ iconv_mbstocs, >+ NULL >+}; >+ >+static XlcConv >+open_iconv_mbstocs(from_lcd, from_type, to_lcd, to_type) >+ XLCd from_lcd; >+ char *from_type; >+ XLCd to_lcd; >+ char *to_type; >+{ >+ return create_tocs_conv(from_lcd, &iconv_mbstocs_methods); >+} >+ >+/* from XlcNMultiByte to XlcNChar */ >+ >+static int >+iconv_mbtocs(conv, from, from_left, to, to_left, args, num_args) >+ XlcConv conv; >+ XPointer *from; >+ int *from_left; >+ XPointer *to; >+ int *to_left; >+ XPointer *args; >+ int num_args; >+{ >+ Utf8Conv *preferred_charsets; >+ XlcCharSet last_charset = NULL; >+ unsigned char const *src; >+ unsigned char const *srcend; >+ unsigned char *dst; >+ unsigned char *dstend; >+ int unconv_num; >+ >+ if (from == NULL || *from == NULL) >+ return 0; >+ >+ preferred_charsets = (Utf8Conv *) conv->state; >+ src = (unsigned char const *) *from; >+ srcend = src + *from_left; >+ dst = (unsigned char *) *to; >+ dstend = dst + *to_left; >+ unconv_num = 0; >+ >+ while (src < srcend && dst < dstend) { >+ Utf8Conv chosen_charset = NULL; >+ XlcSide chosen_side = XlcNONE; >+ wchar_t wc; >+ int consumed; >+ int count; >+ >+ /* Uses stdc iconv to convert multibyte -> widechar */ >+ >+ consumed = mbtowc(&wc, src, srcend-src); >+ if (consumed == 0) >+ break; >+ if (consumed == -1) { >+ src++; >+ unconv_num++; >+ continue; >+ } >+ >+ count = charset_wctocs(preferred_charsets, &chosen_charset, &chosen_side, >conv, dst, wc, dstend-dst); >+ if (count == RET_TOOSMALL) >+ break; >+ if (count == RET_ILSEQ) { >+ src += consumed; >+ unconv_num++; >+ continue; >+ } >+ >+ if (last_charset == NULL) { >+ last_charset = >+ _XlcGetCharSetWithSide(chosen_charset->name, chosen_side); >+ if (last_charset == NULL) { >+ src += consumed; >+ unconv_num++; >+ continue; >+ } >+ } else { >+ if (!(last_charset->xrm_encoding_name == chosen_charset->xrm_name >+ && (last_charset->side == XlcGLGR >+ || last_charset->side == chosen_side))) >+ break; >+ } >+ src += consumed; >+ dst += count; >+ } >+ >+ if (last_charset == NULL) >+ return -1; >+ >+ *from = (XPointer) src; >+ *from_left = srcend - src; >+ *to = (XPointer) dst; >+ *to_left = dstend - dst; >+ >+ if (num_args >= 1) >+ *((XlcCharSet *)args[0]) = last_charset; >+ >+ return unconv_num; >+} >+ >+static XlcConvMethodsRec iconv_mbtocs_methods = { >+ close_tocs_converter, >+ iconv_mbtocs, >+ NULL >+}; >+ >+static XlcConv >+open_iconv_mbtocs (from_lcd, from_type, to_lcd, to_type) >+ XLCd from_lcd; >+ char *from_type; >+ XLCd to_lcd; >+ char *to_type; >+{ >+ return create_tocs_conv(from_lcd, &iconv_mbtocs_methods ); >+} >+ >+/* from XlcNMultiByte to XlcNString */ >+ >+static int >+iconv_mbstostr(conv, from, from_left, to, to_left, args, num_args) >+ XlcConv conv; >+ XPointer *from; >+ int *from_left; >+ XPointer *to; >+ int *to_left; >+ XPointer *args; >+ int num_args; >+{ >+ unsigned char const *src; >+ unsigned char const *srcend; >+ unsigned char *dst; >+ unsigned char *dstend; >+ int unconv_num; >+ >+ if (from == NULL || *from == NULL) >+ return 0; >+ >+ src = (unsigned char const *) *from; >+ srcend = src + *from_left; >+ dst = (unsigned char *) *to; >+ dstend = dst + *to_left; >+ unconv_num = 0; >+ >+ while (src < srcend) { >+ unsigned char c; >+ wchar_t wc; >+ int consumed; >+ >+ /* Uses stdc iconv to convert multibyte -> widechar */ >+ >+ consumed = mbtowc(&wc, src, srcend-src); >+ if (consumed == 0) >+ break; >+ if (dst == dstend) >+ break; >+ if (consumed == -1) { >+ consumed = 1; >+ c = BAD_CHAR; >+ unconv_num++; >+ } else { >+ if ((wc & ~(wchar_t)0xff) != 0) { >+ c = BAD_CHAR; >+ unconv_num++; >+ } else >+ c = (unsigned char) wc; >+ } >+ *dst++ = c; >+ src += consumed; >+ } >+ >+ *from = (XPointer) src; >+ *from_left = srcend - src; >+ *to = (XPointer) dst; >+ *to_left = dstend - dst; >+ >+ return unconv_num; >+} >+ >+static XlcConvMethodsRec iconv_mbstostr_methods = { >+ close_converter, >+ iconv_mbstostr, >+ NULL >+}; >+ >+static XlcConv >+open_iconv_mbstostr(from_lcd, from_type, to_lcd, to_type) >+ XLCd from_lcd; >+ char *from_type; >+ XLCd to_lcd; >+ char *to_type; >+{ >+ return create_conv(from_lcd, &iconv_mbstostr_methods); >+} >+ >+/* from XlcNString to XlcNMultiByte */ >+static int >+iconv_strtombs(conv, from, from_left, to, to_left, args, num_args) >+ XlcConv conv; >+ XPointer *from; >+ int *from_left; >+ XPointer *to; >+ int *to_left; >+ XPointer *args; >+ int num_args; >+{ >+ unsigned char const *src; >+ unsigned char const *srcend; >+ unsigned char *dst; >+ unsigned char *dstend; >+ >+ if (from == NULL || *from == NULL) >+ return 0; >+ >+ src = (unsigned char const *) *from; >+ srcend = src + *from_left; >+ dst = (unsigned char *) *to; >+ dstend = dst + *to_left; >+ >+ while (src < srcend) { >+ int count = wctomb(dst, *src); >+ if (count < 0) >+ break; >+ dst += count; >+ src++; >+ } >+ >+ *from = (XPointer) src; >+ *from_left = srcend - src; >+ *to = (XPointer) dst; >+ *to_left = dstend - dst; >+ >+ return 0; >+} >+ >+static XlcConvMethodsRec iconv_strtombs_methods= { >+ close_converter, >+ iconv_strtombs, >+ NULL >+}; >+ >+static XlcConv >+open_iconv_strtombs(from_lcd, from_type, to_lcd, to_type) >+ XLCd from_lcd; >+ char *from_type; >+ XLCd to_lcd; >+ char *to_type; >+{ >+ return create_conv(from_lcd, &iconv_strtombs_methods); >+} >+ >+/***************************************************************************/ >+/* Part II: An iconv locale loader. >+ * >+ *Here we can assume that "multi-byte" is iconv and that `wchar_t' is Unicode. >+ */ >+ >+/* from XlcNMultiByte to XlcNWideChar */ >+static int >+iconv_mbstowcs(conv, from, from_left, to, to_left, args, num_args) >+ XlcConv conv; >+ XPointer *from; >+ int *from_left; >+ XPointer *to; >+ int *to_left; >+ XPointer *args; >+ int num_args; >+{ >+ char *src = *((char **) from); >+ wchar_t *dst = *((wchar_t **) to); >+ int src_left = *from_left; >+ int dst_left = *to_left; >+ int length, unconv_num = 0; >+ >+ while (src_left > 0 && dst_left > 0) { >+ length = mbtowc(dst, src, src_left); >+ >+ if (length > 0) { >+ src += length; >+ src_left -= length; >+ if (dst) >+ dst++; >+ dst_left--; >+ } else if (length < 0) { >+ src++; >+ src_left--; >+ unconv_num++; >+ } else { >+ /* null ? */ >+ src++; >+ src_left--; >+ if (dst) >+ *dst++ = L'\0'; >+ dst_left--; >+ } >+ } >+ >+ *from = (XPointer) src; >+ if (dst) >+ *to = (XPointer) dst; >+ *from_left = src_left; >+ *to_left = dst_left; >+ >+ return unconv_num; >+} >+ >+static XlcConvMethodsRec iconv_mbstowcs_methods = { >+ close_converter, >+ iconv_mbstowcs, >+ NULL >+} ; >+ >+static XlcConv >+open_iconv_mbstowcs(from_lcd, from_type, to_lcd, to_type) >+ XLCd from_lcd; >+ char *from_type; >+ XLCd to_lcd; >+ char *to_type; >+{ >+ return create_conv(from_lcd, &iconv_mbstowcs_methods); >+} >+ >+static int >+iconv_wcstombs(conv, from, from_left, to, to_left, args, num_args) >+ XlcConv conv; >+ XPointer *from; >+ int *from_left; >+ XPointer *to; >+ int *to_left; >+ XPointer *args; >+ int num_args; >+{ >+ wchar_t *src = *((wchar_t **) from); >+ char *dst = *((char **) to); >+ int src_left = *from_left; >+ int dst_left = *to_left; >+ int length, unconv_num = 0; >+ >+ while (src_left > 0 && dst_left >= MB_CUR_MAX) { >+ length = wctomb(dst, *src); /* XXX */ >+ >+ if (length > 0) { >+ src++; >+ src_left--; >+ if (dst) >+ dst += length; >+ dst_left -= length; >+ } else if (length < 0) { >+ src++; >+ src_left--; >+ unconv_num++; >+ } >+ } >+ >+ *from = (XPointer) src; >+ if (dst) >+ *to = (XPointer) dst; >+ *from_left = src_left; >+ *to_left = dst_left; >+ >+ return unconv_num; >+} >+ >+static XlcConvMethodsRec iconv_wcstombs_methods = { >+ close_converter, >+ iconv_wcstombs, >+ NULL >+} ; >+ >+static XlcConv >+open_iconv_wcstombs(from_lcd, from_type, to_lcd, to_type) >+ XLCd from_lcd; >+ char *from_type; >+ XLCd to_lcd; >+ char *to_type; >+{ >+ return create_conv(from_lcd, &iconv_wcstombs_methods); >+} >+ >+static XlcConv >+open_iconv_mbstofcs( >+ XLCd from_lcd, >+ const char *from_type, >+ XLCd to_lcd, >+ const char *to_type) >+{ >+ return create_tofontcs_conv(from_lcd, &iconv_mbstocs_methods); >+} >+ > XLCd > _XlcUtf8Loader( > const char *name) >@@ -1808,21 +2391,18 @@ > if (lcd == (XLCd) NULL) > return lcd; > >- /* The official IANA name for UTF-8 is "UTF-8" in upper case with a dash. */ >- if (!XLC_PUBLIC_PART(lcd)->codeset || >- (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "UTF-8"))) { >+ if (!XLC_PUBLIC_PART(lcd)->codeset) { > _XlcDestroyLC(lcd); > return (XLCd) NULL; > } >- >+ /* The official IANA name for UTF-8 is "UTF-8" in upper case with a dash. */ >+ else if (!_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "UTF-8")) { >+ > /* Register elementary converters. */ > > _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_utf8towcs); > > _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstoutf8); >- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr); >- >- _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_strtowcs); > > /* Register converters for XlcNCharSet. This implicitly provides > * converters from and to XlcNCompoundText. */ >@@ -1831,10 +2411,6 @@ > _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_utf8tocs); > _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_utf8tocs1); > >- _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs); >- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs); >- _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_wcstocs1); >- > _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_strtoutf8); > _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_utf8tostr); > _XlcSetConverter(lcd, XlcNUtf8String, lcd, XlcNMultiByte, open_identity); >@@ -1842,6 +2418,39 @@ > > /* Register converters for XlcNFontCharSet */ > _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNFontCharSet, open_utf8tofcs); >+ } >+ >+ /* GB18030 Stuff */ >+ else if(!_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "GB18030")) { >+ >+ /* Register elementary converters. */ >+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_iconv_mbstowcs); >+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_iconv_wcstombs); >+ >+ /* Register converters for XlcNCharSet. This implicitly provides >+ * converters from and to XlcNCompoundText. */ >+ >+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_iconv_cstombs); >+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_iconv_mbstocs); >+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_iconv_mbtocs); >+ _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_iconv_strtombs); >+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_iconv_mbstostr); >+ >+ /* Register converters for XlcNFontCharSet */ >+ _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNFontCharSet, open_iconv_mbstofcs); >+ } >+ else { >+ _XlcDestroyLC(lcd); >+ return (XLCd) NULL; >+ } >+ >+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr); >+ _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_strtowcs); >+ _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs); >+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs); >+ _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_wcstocs1); >+ >+ /* Register converters for XlcNFontCharSet */ > _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNFontCharSet, open_wcstofcs); > > _XlcAddUtf8Converters(lcd); >diff -urN XFree86-4.1.0/xc/nls/Compose/Imakefile >XFree86-4.1.0.gb18030/xc/nls/Compose/Imakefile >--- XFree86-4.1.0/xc/nls/Compose/Imakefile Fri Apr 27 05:09:40 2001 >+++ XFree86-4.1.0.gb18030/xc/nls/Compose/Imakefile Wed Jun 20 12:04:34 2001 >@@ -69,6 +69,7 @@ > ComposeTarget(vi_VN.viscii) > ComposeTarget(zh) > ComposeTarget(zh_CN.gbk) >+ComposeTarget(zh_CN.gb18030) > ComposeTarget(zh_TW) > ComposeTarget(zh_TW.big5) > >diff -urN XFree86-4.1.0/xc/nls/Compose/zh_CN.gb18030 >XFree86-4.1.0.gb18030/xc/nls/Compose/zh_CN.gb18030 >--- XFree86-4.1.0/xc/nls/Compose/zh_CN.gb18030 Thu Jan 1 08:00:00 1970 >+++ XFree86-4.1.0.gb18030/xc/nls/Compose/zh_CN.gb18030 Wed Jun 20 12:04:02 2001 >@@ -0,0 +1,15 @@ >+# >+# zh_CN.GB18030 Compose Sequence >+# >+# Sequence Definition >+# >+# $XFree86: xc/nls/Compose/zh_CN.gbk,v 1.1 1999/08/28 09:00:40 dawes Exp $ >+# >+# This file currently has no entries. It appears that a compose file (even >+# just an empty one) is required for the appropriate keysyms to work for >+# this encoding. >+# >+# <Multi_key> Means <Compose> >+# Special Character >+ >+# End of Sequence Definition >diff -urN XFree86-4.1.0/xc/nls/XLC_LOCALE/Imakefile >XFree86-4.1.0.gb18030/xc/nls/XLC_LOCALE/Imakefile >--- XFree86-4.1.0/xc/nls/XLC_LOCALE/Imakefile Wed Mar 7 02:54:45 2001 >+++ XFree86-4.1.0.gb18030/xc/nls/XLC_LOCALE/Imakefile Wed Jun 20 12:00:42 2001 >@@ -86,6 +86,7 @@ > LTarget(vi_VN.viscii) > LTarget(zh) > LTarget(zh_CN.gbk) >+LTarget(zh_CN.gb18030) > LTarget(zh_HK.big5hkscs) > LTarget(zh_TW) > LTarget(zh_TW.big5) >diff -urN XFree86-4.1.0/xc/nls/XLC_LOCALE/zh_CN.gb18030 >XFree86-4.1.0.gb18030/xc/nls/XLC_LOCALE/zh_CN.gb18030 >--- XFree86-4.1.0/xc/nls/XLC_LOCALE/zh_CN.gb18030 Thu Jan 1 08:00:00 1970 >+++ XFree86-4.1.0.gb18030/xc/nls/XLC_LOCALE/zh_CN.gb18030 Wed Jun 20 12:00:30 >2001 >@@ -0,0 +1,77 @@ >+XCOMM XFree86 NLS for Chinese encoding GB18030 >+XCOMM Modified from xc/nls/XLC_LOCALE/en_US.UTF-8 >+XCOMM by James Su <[EMAIL PROTECTED]> >+ >+XCOMM >+XCOMM XLC_FONTSET category >+XCOMM >+XLC_FONTSET >+ >+on_demand_loading True >+ >+object_name generic >+ >+XCOMM We leave the legacy encodings in for the moment, because we don't >+XCOMM have that many ISO10646 fonts yet. >+XCOMM fs0 class (7 bit ASCII) >+fs0 { >+ charset { >+ name ISO8859-1:GL >+ } >+ font { >+ primary ISO8859-1:GL >+ vertical_rotate all >+ } >+} >+ >+XCOMM fs1 class (Chinese Han Character) >+fs1 { >+ charset { >+ name GB2312.1980-0:GL >+ } >+ font { >+ primary GB2312.1980-0:GL >+ } >+} >+ >+XCOMM fs2 class >+fs2 { >+ charset { >+ name ISO10646-1 >+ } >+ font { >+ primary ISO10646-1 >+ } >+} >+END XLC_FONTSET >+ >+XCOMM >+XCOMM XLC_XLOCALE category >+XCOMM >+XLC_XLOCALE >+ >+encoding_name GB18030 >+mb_cur_max 4 >+state_depend_encoding False >+ >+XCOMM cs0 class >+cs0 { >+ side GL:Default >+ length 1 >+ ct_encoding ISO8859-1:GL >+} >+ >+XCOMM cs1 class >+cs1 { >+ side GR >+ length 2 >+ ct_encoding GB2312.1980-0:GL; GB2312.1980-0:GR >+} >+ >+XCOMM cs2 class >+cs2 { >+ side none >+ ct_encoding ISO10646-1 >+} >+ >+END XLC_XLOCALE >diff -urN XFree86-4.1.0/xc/nls/compose.dir XFree86-4.1.0.gb18030/xc/nls/compose.dir >--- XFree86-4.1.0/xc/nls/compose.dir Sat Apr 7 02:16:27 2001 >+++ XFree86-4.1.0.gb18030/xc/nls/compose.dir Wed Jun 20 12:03:37 2001 >@@ -208,6 +208,7 @@ > zh/Compose zh_CN.eucCN > zh/Compose zh_CN.GB2312 > zh_CN.gbk/Compose zh_CN.GBK >+zh_CN.gb18030/Compose zh_CN.GB18030 > zh_TW.big5/Compose zh_TW.big5 > zh_TW.big5/Compose zh_TW.Big5 > zh_TW/Compose zh_TW.eucTW >@@ -414,6 +415,7 @@ > zh/Compose: zh_CN.eucCN > zh/Compose: zh_CN.GB2312 > zh_CN.gbk/Compose: zh_CN.GBK >+zh_CN.gb18030/Compose: zh_CN.GB18030 > zh_TW.big5/Compose: zh_TW.big5 > zh_TW.big5/Compose: zh_TW.Big5 > zh_TW/Compose: zh_TW.eucTW >diff -urN XFree86-4.1.0/xc/nls/locale.alias XFree86-4.1.0.gb18030/xc/nls/locale.alias >--- XFree86-4.1.0/xc/nls/locale.alias Wed May 30 06:48:34 2001 >+++ XFree86-4.1.0.gb18030/xc/nls/locale.alias Wed Jun 20 12:02:56 2001 >@@ -498,6 +498,7 @@ > zh_CN.euc zh_CN.eucCN > zh_CN.gb2312 zh_CN.eucCN > zh_CN.gbk zh_CN.GBK >+zh_CN.gb18030 zh_CN.GB18030 > zh_TW zh_TW.big5 > zh_TW.EUC zh_TW.eucTW > zh_TW.euc zh_TW.eucTW >@@ -1188,6 +1189,7 @@ > zh_CN.euc: zh_CN.eucCN > zh_CN.gb2312: zh_CN.eucCN > zh_CN.gbk: zh_CN.GBK >+zh_CN.gb18030: zh_CN.GB18030 > zh_TW: zh_TW.big5 > zh_TW.EUC: zh_TW.eucTW > zh_TW.euc: zh_TW.eucTW >diff -urN XFree86-4.1.0/xc/nls/locale.dir XFree86-4.1.0.gb18030/xc/nls/locale.dir >--- XFree86-4.1.0/xc/nls/locale.dir Wed May 30 06:48:34 2001 >+++ XFree86-4.1.0.gb18030/xc/nls/locale.dir Wed Jun 20 12:02:27 2001 >@@ -207,6 +207,7 @@ > zh/XLC_LOCALE zh_CN.eucCN > zh/XLC_LOCALE zh_CN.GB2312 > zh_CN.gbk/XLC_LOCALE zh_CN.GBK >+zh_CN.gb18030/XLC_LOCALE zh_CN.GB18030 > zh_HK.big5hkscs/XLC_LOCALE zh_HK.big5hkscs > zh_TW.big5/XLC_LOCALE zh_TW.big5 > zh_TW.big5/XLC_LOCALE zh_TW.Big5 >@@ -553,6 +554,7 @@ > zh/XLC_LOCALE: zh_CN.eucCN > zh/XLC_LOCALE: zh_CN.GB2312 > zh_CN.gbk/XLC_LOCALE: zh_CN.GBK >+zh_CN.gb18030/XLC_LOCALE: zh_CN.GB18030 > zh_HK.big5hkscs/XLC_LOCALE: zh_HK.big5hkscs > zh_TW.big5/XLC_LOCALE: zh_TW.big5 > zh_TW.big5/XLC_LOCALE: zh_TW.Big5 > > XFree86-4.1.0-gb18030.patch > > Content-Type: > > text/plain > Content-Encoding: > > 7bit > > -- Yu Shao Red Hat Asia-Pacific +61 7 3872 4835 Legal: http://apac.redhat.com/disclaimer _______________________________________________ I18n mailing list [EMAIL PROTECTED] http://XFree86.Org/mailman/listinfo/i18n