Hatena::ブログ(Diary)

玉虫色に染まれ! このページをアンテナに追加 RSSフィード Twitter

2010-05-04

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. plog: sans、sans-serif、monospaceのフォントを変更する
  2. 書体関係 Wiki - unixuser200403-2

この解決法の副作用

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

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

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

s@gis@gi 2010/05/05 18:28 Pardon me that I'm not a Japanese speaker.

It seems to me you've been trying to resolve that flash font issues caused by the language-selector package. You probably have the config file /etc/fonts/conf.d/69-language-selector-ja-jp.conf in effect, and flash player (or xft?) just simply picks the first font from the font family list and refuses to fall back further when the charset doesn't match.

In you .fonts.conf, i see you push the Japanese font to the top of the font family with strong binding. It seems like a fine solution to the issue, but that unfortunately will globally cause irritability when non-Japanese characters are displayed using the Japanese font.

How about adding an extra test expression in your fontconfig? In your case:

<?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>

See if it works.

over80over80 2010/05/05 22:46 To: s@gi

Thank you for your considerate comment.
It seems your proposal works pretty well for me.
I will fix my article soon.

Regards,

s@gis@gi 2010/05/06 22:28 No problems at all, over80. It's always a good thing to share experiences.

My method is probably not the optimal way to do it. If you figure out something better, like testing against charsets, please do publish it. (I've been looking up on how to make charset comparison on several online manuals, but to no avail.)

Best wishes.

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証