この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2005年7月)

2005年7月23日

Bug 3383 パスにShift_JISで0x7Cを含むファイルからFirefoxを起動できない
初回投稿日時: 2005年07月23日05時07分56秒
最終更新日時: 2005年07月23日05時14分04秒
カテゴリ: Firefox Mozilla Core
SNS: (list)

ようやく色々と判明。

まずは原因。0x7Cは'|'(pipe)だが、これは本来、URLエンコードする場合にエスケープされるべきものである。しかし、昔のNetscapeブラウザで'|'を':'の代わりに使っていたという歴史があるので、互換性をとるために'|'はファイルパスではエスケープしないようになっている。これは元々、各種ファイルシステムで'|'がパス名に使えないことから問題が無かったことだ。つまり、ローカルファイルをURLエンコードする際に、0x7Cが"%7C"になることはなかった訳だ。

しかし、Firefoxはとても都合の悪いことに、複数のページをホームページに指定する際のURLの区切り文字に'|'を使ってしまった。このため、URLエンコードでエスケープされなかった0x7CでURLが区切られてしまい、ファイルパスが正常に伝わらなくなってしまっている。

解決方法は三種類。そのうち二種類は既に進行中だった。

まず、一つ目の解決方法は、'|'をURLの区切り文字として使わないようにするというもの。これは代わりにスペースを用いるパッチが提案されているが、一向に進展しない。英語圏では大した問題ではないため、このままでは見送りの可能性も出てきた。

二つめの解決方法は、Unicodeパスを利用できるようにするために、ファイルパスのURL化の際にUTF-8でエンコードしようというものだ。パッチも提出されている。しかし、これはとても大きな仕様変更なので、私には1.8のブランチ後にはチェックイン不可能なのではないかと思える。

最後に、今日、提案した解決方法は、非ASCII文字の直後にきた0x7Cはエスケープしてしまう、というものだ。常に0x7Cをエスケープしてしまうと、file:///C|/foo/bar.txtという入力でファイルが開けなくなる副作用を確認したので、非ASCII文字の直後に限定したのだ。これならば問題はないが、'|'がパスとして使われない文字なので、ISO-8859-Xでも問題が無いという綱渡りな仕様ではある。(もっとも、ドライブレターの直後の'|'以外はエスケープされても問題ないのだが、それ以外の部分でエスケープされたり、されなかったりすると気持ち悪いだろう。)

関連するかもしれないエントリ

bug 3383を含むエントリ