From: Tomohiro K. <tk...@ri...> - 2002-03-02 06:25:06
|
久保田です。 Xft 使用時に、ISO-8859-1 以外の 8 ビットエンコーディングが正しく 表示されない問題があります。たとえば、~/.mlterm/aafont に、 ISO8859_2=Thryomanes-iso10646-1; と書いて mlterm -A -E ISO-8859-2 と実行してみると、ISO-8859-2 ではなく ISO-8859-1 が表示されます。 調べてみると、xft_draw_str() (ml_window.c) で、 ch_bytes = ml_char_bytes( &chars[counter]) ; if( ch_size == 1) { str8[str_len++] = ch_bytes[0] ; } else { char ucs4_bytes[4] ; if( ! ml_convert_to_xft_ucs4( ucs4_bytes , ch_bytes , ch_size , ml_char_cs(&chars[counter]))) つまり、1 バイト文字はすべてそのまま通過してしまっています。 Xft API は文字はすべて Unicode で扱うので、ここで else 以下のような Unicode への変換が必要です。 次に、else 以下で呼ばれている ml_convert_to_xft_ucs4() (ml_char_encoding.c) ですが、これは ISO-8859-1 と US_ASCII を扱うことが できないようです。 int ml_convert_to_ucs4( u_char * ucs4_bytes , u_char * src_bytes , size_t src_size , mkf_charset_t cs ) { if( cs == ISO10646_UCS4_1) { ... } else if( cs == ISO10646_UCS2_1) { ... } else if( cs != US_ASCII && cs != ISO8859_1_R) { ... if( mkf_map_to_ucs4( &ucs4 , &non_ucs)) { memcpy( ucs4_bytes , ucs4.ch , 4) ; } ... } return 1; } ISO-8859-1 と US_ASCII の時には、 ucs4_bytes[0] = 0x0 ; ucs4_bytes[1] = 0x0 ; ucs4_bytes[2] = 0x0 ; ucs4_bytes[3] = src_bytes[0] ; が必要になるのではないですか。 それから、上記で呼ばれている mkf_map_to_ucs4() ですが、 ISO-8859-2 などを扱うことができないようです。 ここまで追跡して、よくわからなくなってしまいました。 --- 久保田智広 Tomohiro KUBOTA <ku...@de...> http://www.debian.or.jp/~kubota/ "Introduction to I18N" http://www.debian.org/doc/manuals/intro-i18n/ |