Ubuntu 10.04 で flash の文字化けを解消する

5月になりました。

ということは Ubuntu の半年ごとの定期リリースが行われたということですね。

今回のUbuntu 10.04 は、ベータ時点でもなかなか安定しているという評判を聞いていたので、今回は様子見もせずにさっくりアップデートしてみました。一部、私の個人的な都合による設定の悪影響などで不安定な所があったものの、それ以外はすんなり移行できたようです。(まだ、使い始めて数時間ですが。)

ところが、「さて、ゴールデンウィーク中に投稿された動画チェックを……」と思ってニコニコ動画を開いてびっくり。 Flash の中の文字が化け化けで日本語がまったく表示できていないようです。ニコ厨としてはこれは見逃せません。(本当はツッコミのあったAVRのエントリを書くつもりだったのですが、うっかりアップデートに手をだしてしまったのが失敗でした。)

今日は、この問題に対する対処法を紹介します。 Ubuntu 10.04で、と銘打っていますが、対策自体は別に 10.04 に限った話でも Ubuntu に限ったことでもないので、他の環境でも応用できるかと思います。

2010-05-05 追記: s@gi さんからのご指摘で、一部修正しました。 修正箇所にはこの文と同様のスタイルで注釈を付けています。

2010-05-08 追記(ここから)

現在は、この問題は Ubuntu Japanese Team の language-selector で修正されているようです。

$ zcat /usr/share/doc/language-selector-common/changelog.gz | grep -A 10 ja2
language-selector (0.5.8~ja2) lucid; urgency=low

  * drop DejaVu fonts from 69-language-selector-ja-jp.conf file to 
    work fine with Adobe Flash.

 -- Jun Kobayashi <jkbys@ubuntu.com>  Tue, 04 May 2010 17:09:59 +0900

language-selector (0.5.8~ja1) lucid; urgency=low

  * refine 69-language-selector-ja-jp.conf file.

このバージョンにアップデートすれば問題は起きないはずです。

もし、あなたの環境で似たような現象が出ている場合は、下記の原因のセクションを読んで本当に同じ問題なのか確認したほうが良いでしょう。

2010-05-08 追記(ここまで)

原因

私は Flash プラグイン自体は、10.04にアップグレードする前から、 flashplugin-installer パッケージを使用していました。 これは Macromedia のバイナリプラグインDebianパッケージ化したものなので、本質的には Macromedia のサイトから拾ってきてインストールしたのと同じ状態です。

根本的にはこの Flash プラグインの作りがイマイチだというのが原因なのですが、その問題が表面化したのは、OSのアップグレードでフォント環境が変化したためです。

とりあえずこの問題が起きている方は、以下のコマンドをタイプして実行結果を見てみてください。(私のところで問題が起きていた時の実行結果を例として併記します。)

$ fc-match :lang=ja
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match serif:lang=ja
DejaVuSerif.ttf: "DejaVu Serif" "Book"
$ fc-match sans-serif:lang=ja
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match monospace:lang=ja
TakaoGothic.ttf: "Takaoゴシック" "Regular"

2010-05-05 修正: フォントの検索条件を lang=ja に限定しました。flashプラグインでも言語指定は一応きちんとしてくれるようです。

Flashプラグインはここで表示されるフォントが使われるので、DejaVuのような日本語非対応フォントでは化けてしまいます。(まともなソフトだとここに表示されたフォントがダメでも第二候補、第三候補のフォントを順次見て行ってくれるのですが……)

これを解決するには、 sans-serif などのフォントの定義を変えてやれば良い、ということになります。簡単なのは .fonts.conf を使う方法です。

.fonts.conf でフォントの定義を編集する

私は、とりあえず表示さえされれば良かったので、10.04で日本語のデフォルトとして新規採用された IPA派生フォントの Takao fonts を使うように、 ~/.fonts.conf ファイルを作成しました。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
	<match target="pattern">
		<test qual="any" name="lang" compare="contains">
			<string>ja</string>
		</test>
		<test name="family" qual="any">
			<string>serif</string>
		</test>
		<edit name="family" mode="prepend" binding="strong">
			<string>TakaoPMincho</string>
		</edit>
	</match>
	<match target="pattern">
		<test qual="any" name="lang" compare="contains">
			<string>ja</string>
		</test>
		<test name="family" qual="any">
			<string>sans-serif</string>
		</test>
		<edit name="family" mode="prepend" binding="strong">
			<string>TakaoPGothic</string>
		</edit>
	</match>
</fontconfig>

2010-05-05 修正: lang=ja の場合のみ置き換えるように条件を追加しました。各matchの最初のtestが追加したものです。

見ればなんとなく分かると思うので詳細な解説は省きますが、要は「serif なら、 "Takao P明朝" を、 sans-serif なら "Takao Pゴシック" を最優先候補として返す」という設定です。

このファイルがホームディレクトリにある状態で、いったんフォントキャッシュをクリアし、さきほどのコマンドを打ってみると以下のようになります。(.fonts.conf に文法間違いがあると fc-match コマンドでエラーメッセージが出るので、きちんと確認してください。)

$ fc-cache -rv
(中略)
fc-cache: succeeded

$ fc-match :lang=ja
ttf-japanese-gothic.ttf: "TakaoPGothic" "Regular"
$ fc-match serif:lang=ja
ttf-japanese-mincho.ttf: "TakaoPMincho" "Regular"
$ fc-match sans-serif:lang=ja
ttf-japanese-gothic.ttf: "TakaoPGothic" "Regular"
$ fc-match monospace:lang=ja
TakaoGothic.ttf: "Takaoゴシック" "Regular"

2010-05-05 修正: 最初の例と同様に修正しました。

この状態になれば、Flashでも日本語が表示されるようになるかと思います。

参考ページ:

  1. http://ploguser.blogspot.com/2007/08/flashde.html
  2. 書体関係 Wiki - unixuser200403-2

この解決法の副作用

Takao Fonts は、もともと DejaVu に次ぐ高優先度の設定がされています。なので、(まともなソフトでは) serif で描画しようとすると日本語や中国語以外は "DejaVu Serif" で、日本語は "Takao P明朝" で描画されます。この優先度を逆にしたわけですから、その影響は「両方のフォントが共に対応している文字の描画」に現れます。つまり、アルファベットや数字などが、設定前なら DejaVu で描画されていたのが、 Takao Fonts に変わってしまうわけです。

もちろん、 serif や sans-serif みたいなエイリアス名ではなく、具体的なフォント名を直接指定して描画するプログラムには影響は無いのですがデフォルトでは sans-serif あたりになっていることが多いと思いますので、意外と影響範囲は広いです。

この設定を真似される方は、関係ないところで描画が微妙に変わってしまう可能性があるということだけは気に留めておいてください。