Kota Abe
English page>>

KDEと戯れた記録

2003/09/22: このページの内容は今となってはかなり古いので,あまり参考にならないと思います.某所でもすでにこのパッチは使っていません.(代わりに未公開の別のパッチを使っています.)

KDE-3.0.3/Qt-3.0.5 ベース

リンク

パッチ

Qt-3.0.5 へのパッチです.

  • (jisx0208.1983-0 に加えて) jisx0208.1990-0 フォントを使用できるようにする.
  • Unicodeエンコードされた日本語フォントで,一部の記号(♪,℃,→等)が使用できない問題を解消する.
  • Windows系のフォントに含まれている,丸数字やローマ数字等のNEC拡張文字集合を使用可能にする.
  • Qtの Font Substitution を使って Nimbus Sans L 等のフォントと Unicode エンコードされた日本語フォントを組み合わせたときに,ダッシュ(JIS 213D)やハイフン(JIS 213E)が空白になる問題を解消する.

ダウンロード

Konquerorのフォント

日本語の True Type Font では,アクセントがついた文字(Á等)が表示できないので,ブラウザのフォントは Nimbus Sans l [Xft] のようなフォントにしておき,qtrc で

Nimbus Sans l [Xft]=Dfggothicpw5^e

のようにするのが吉かと.

吉かと思ったが,こうすると一部の日本語フォントが出ないことが判明.ここを表示させると分かる.

→上記のパッチで解消

Qt

一般の Unicode フォントは Unicode のすべての文字が揃っているわけではない.このため,Qtは表示しようとしている文字が,ある Unicode フォントで表示できるかどうかを以下のように判定している(らしい).

  • その文字が属するスクリプト(Latin,Greek, CurrencySymbols, etc.)を決定する(qfont.cpp の QFontPrivate::scriptForChar).
  • スクリプト毎に代表文字が決まっている.代表文字はstatic QChar sampleCharacter(QFont::Script script)で決まる.
  • 代表文字がそのフォントにあるかを調べる.あればそのフォントが使えると判断する.なければ次の置換フォントにフォールバックする.

Qt-3.0.5の実装では,U+00XX は Latin というスクリプトに属す.Latin の代表文字は U+0030 (数字の "0").ダイナウェアやリコー等の日本語フォントは,U+0030 の文字は存在するので,Qt は Latin に含まれる文字全てがこれらのフォントで表示できると思い込む.

しかし,これらの日本語フォントでは U+0080〜U+00FF の間の文字のほとんど(ウムラウトやアクセントのついた文字)は存在しないので,これらの文字を表示させると空白になる.また,Qtのフォント置換機構も効かない.

音符(♪,U+266A)は MiscellaneousSymbols というスクリプトに属する.これは通常の日本語フォントで表示できるはずだが,MiscellaneousSymbolsの代表文字がU+2600(お日様マーク?)で,これは通常の日本語フォントには含まれない.このため,Qt は日本語フォントでは♪は表示できないと思い込んでしまう.

ダッシュ(―, JIS 0x213d)とハイフン(‐, JIS 0x213e) はそれぞれ U+2015 (Horizontal Bar) と U+2010 (Hyphen) にマップされている.XFree86付属の Nimbus Sans L のような Type1 フォントでは,この位置は空で,代わりに U+2013 (EN dash),U+2014 (EM dash) に似たような文字が入っている.

Qtでは,大ざっぱなことにUnicodeフォントならば U+2000〜U+206f の文字を表示できると仮定しているため,Nimbus Sans Lをフォントに指定した場合,Substitute Fontを指定しても,空白が表示されてしまう.

→上記のパッチで解消

Qtとビットマップフォント

Gothic [Shinonome] で菱形(◆, JIS 0x2221, U+25C6)が□になってしまう原因.

菱形は GeometricSymbols というスクリプトに属する.Qtは,まずUnicode エンコードされた Shinonome [Gothic] フォントがあるかをチェックする.ない場合,QFontPrivate::findFont から呼び出される QFontPrivate::bestFamilyMember あたりで使用するフォントを探すことになる.

Qtはスクリプト毎に XLFD で使われる "jisx0208.1983-0" のようなエンコーディングを保持していて,GeometricSymbols に対応するエンコーディングはempty_encodings になっている.empty_encodings の場合,どのフォントも使用できない(多分).ちなみに,スクリプト毎に複数のエンコーディングを保持できる.

GeometricSymbolsのエンコーディング候補に "jisx0208.1983-0" 等を突っ込んでおけば,菱形が表示できる.

→上記のパッチで解消

Konquerorのフォント 其の2

qtrcでBitstream の Cyberbit font のようなUnicodeフォントをフォールバックフォントにしておけば,韓国語や中国語も表示できる.

ついでに Cyberbit font は 1 user でしか使えないので,別のフリーなフォントを探す必要がある.

freetypeとDynalabフォント

dynalabフォントの固定幅フォントには,freetypeで表示させると半角部分も全角部分と同じ幅になってしまうものが存在する(例えば,dfgothic)

これは,フォントファイル中に PostScript hint 情報として固定幅フォントフラグが設定してあるため.設定してあるかどうかは freetype のユーティリティ ftdump で確認できる.バイナリエディタでこのフラグを0に変更すると,ちゃんと表示できる.

Konquerorのスタイルシート

"font-family: Helvetica" のようなスタイルシートでは,Helvetica というフォントを探す.フォントが無い場合,デフォルトのフォントにフォールバックする.

XftConfig でフォントの別名をつければどうにかなると思ったが,うまくいかなかったので Qt 側で対処.

フォールバックするフォントは Qt で決まるが,Anti Alias フォントは選ばれない模様.src/kernel/qfont_x11.cpp のQString QFontPrivate::lastResortFont()あたりの問題?

ソースをhackしなくても,QtのFont Substitutionを使うとなんとかできる.qtconfigでは,存在しないフォントを置換する設定ができないので,qtconfig を使わずに手で設定ファイルを書く..qt/qtrc の[Font Substitutions] セクションに,

Helvetica=Nimbus Sans l [Xft]^eDfggothicpw5^e

と書いておくと,Helvetica が要求されたときに Nimbus Sans l [Xft] を使い,Nimbus Mono l [Xft] にないグリフ(日本語等)はDfggothicpw5 を使うようになる.ちなみに,^e は ^ と e の2文字.

konsole

フォントを選べば普通に使っている分にはきれいに表示できるが,バイナリファイルやUnicodeのファイルをcatしたりするとゴミが残って消えない.

konsole and VJE

VJEをinput methodとして使っている場合,konsole上のttyに出力があると,env XMODIFIERS= xemacs で起動しているXEmacsからフォーカスを奪っていく.

/etc/vje30/vje.cfg の[AtwApp] セクションに書いてあるアプリケーションでそうなる模様.

[Vje]
Path=/usr/local/vje30
[AtwApp]
Title=xedit xclipboard Xfig xfig emacs mule

ここから emacs や mule を削除して vje を再起動すれば OK.

freetype issues

フォントサイズによってはdynafontの→や◆が□に化ける.freetypeの埋め込みビットマップを無効にすれば直る.

#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS

kate

セーブ,ロード時にエンコーディングを指定できる.自動判別はないらしい.

khelpcenter issues

UNIXマニュアルを見ると "まだアイデアすらありません" と出る.英文は"no idea yet".

kdebase/kioslave/man/kio_man.cpp を読むと whatis データベースを参照している模様.Redhatの場合は/var/cache/man/whatis を読むが,kio_man が期待しているフォーマットとはちょっと違うらしい.

Solaris用のパッチ