トップ «前の日記(2007-06-26) 最新 次の日記(2007-06-28)» 編集

jFD開発したりしなかったり日誌

2004|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|
2007年
6月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

2007-06-27 [長年日記]

_ 喉痛い

パンツ一丁で窓開けて寝てたら目が覚めたら布団が全部はがれてた。

なんか喉痛いんですがやっちゃったかしら・・・

_ 2chにあげたMacのSwingの不具合

Swingスレで質問した件についてメモがてら。

最近勉強したが、UTF-8には4種類の正規化方式があり、Windowsのファイル名はNFC、

Macのファイル名はNFDという方式で記録されている。

NFCは濁点付き文字(「が」とか「ピ」とか)のような合成文字を1文字として扱い、

NFDは二文字(「が」→「か」+「゛」、「ピ」→「ヒ」+「゛」)として扱うらしい。

MacのJavaの場合、Java5のSwingではNFDの濁点つき文字をちゃんと1文字として表示できるが、

濁点を1文字として扱ってるためにカーソルが右に1文字ずれて表示されてしまう。

Java6のSwingではカーソルはずれないが濁点を1文字として表示し、たとえばピクチャ.pngは

「ヒ゜クチャ.png」

と表示される。

すっげーだっさい。

2chの人の意見では、Java5ではQuartzエンジンを使って描画してるのでちゃんと合成文字を

表示できるが、文字サイズが正しく取得されてないのでカーソルがずれていて、

Java6はSunのレンダリングエンジンを使ってて、それが合成文字をレンダリングできないのだろう、

とのこと。

Java6からNormalizerがサポートされ、ファイル名は全てNFCとして扱うことで対処は可能だが、

jFD2はJavaの1.4以上からサポートしてるのでこれを使えない。

うーん・・・

ついでで気がついたが、Java6で3文字以上濁点つき文字が続くと表示がバグるようだ。

たとえば「ががが.txt」というファイルを作り、そのファイル名を表示させるとこう見える。

「がかか゛゛.txt」←もっと本格的にひどい問題だということが判明した。

何はともあれバグレポートするしかないだろ、と思うが、こんなことを英語でどう説明したらよいか

わからない。

頭痛い。

_ ↑訂正

上の3文字濁点付き文字が続くと表示がバグる件、ちょっと勘違いしていたというか、

もっと致命的にどうしようもない問題だということが判明した。

MacのJavaで、

new File("ががが.txt").createNewFile();

とやって作られるファイルが「ががが.txt」ではなく「がかか゛゛.txt」だった。

・・・信じられないくらいひどい実装だ!

AppleのJava開発者は24時間正座して反省してから日本人開発者を雇って欲しい。

_ 追加調査結果

さらに実験してみた。

MacのFile#createNewFile()でファイルを作ったときの、左が本来出来るべきファイル名で、

右が実際にできあがったファイル名。

------------------------------------------

がががが.txt > ががかが゛.txt

ががががが.txt > ががかかが゛゛.txt

がががががが.txt > がががかかが゛゛.txt

がぎぐげご.txt > がぎくけご゛゛.txt

がぱが.txt > がはか゜゛.txt

がぱがぱ.txt > がぱかば゜.txt

------------------------------------------

頭痛い。

Java6のNormalizerを使ってNFDに正規化したファイル名で作成したら大丈夫だった。

とりあえずですが、MacはJava5以下をjFD2のサポート対象から外します。

一応動きますが、こういうファイル名だった場合の動作は保証しません。

本日のリンク元
その他のリンク元
検索