meeyar さん、動作検証や新規トピック建て、お疲れさまです。
WADA さん、Bugzilla の対応、お疲れさまです。
meeyar さんが書きました:このスレが随分と長くなったので、とりあえずの回避策のみ新規で分けました。
とのことなので、新規トピックで話が錯綜しないよう、こちらに書かせていただきます。
ぼく自身、"Unicode の正規化" の内容を専門的には知らないのですが、何が起こっているのかの概略を理解するのに役立つかもしれないことを、エンドユーザーの視点でいくつか......。明らかな誤りはもちろん、あまりに大雑把過ぎる部分にはツッコミを入れてください。
(前提)
通常、ひとつの文字は、ひとつの文字コードが対応しています。
ある文字列は、それらに対応するコード列と同等で、コンピュータ内部ではコードで解釈・処理されます。
(Unicode の仕様)
文字コードの規格である Unicode は、多様な言語の膨大な文字(文字集合、符号化方式など)を、Unicode というひとつの規格の中で一括して扱います。
従来の文字コードと異なる特徴点として、文字の "合成" と "分解" という考え方があります。
日本語で例えれば、ひらがな/カタカナのうち、濁音や半濁音の文字は、[元の文字] + [濁点または半濁点] の合成でその文字を表現する、または分解して組み立て直す、ということが可能なことです。従来からある文字コードとの互換性から、[濁点または半濁点が付いた文字] もあります。
(本件で起こっていること)
例として挙げられている「スラド」という文字列でいえば、最後の「ド」が、[ド] 一文字で表現されるか、[ト]+[゙ ] の合成・結合で表現されるかの違いから、受信したフィードのコンテンツを保存するファイル名と、feeds.rdf 内に定義されたそのパス名(URL)に食い違いが生じ、データの正常な読み書きが阻害されている、という話になります。
(事例)
例えば、「ブログ」という文字列は、人間が見ると3文字で、それぞれの文字に Unicode のコードが対応します。文字とコードの対比を区切って表現すると、次のようになろうかと思います。
NFC(composed form)
ブログ
[ブ][ロ][グ]
[30D6][30ED][30B0]
%E3%83%96%E3%83%AD%E3%82%B0
NFD(decomposed form)
ブログ
[[フ][゙]][ロ][[ク][゙]]
[[30D5]+[3099]][30ED][[30AF]+[3099]]
%E3%83%95%E3%82%99%E3%83%AD%E3%82%AF%E3%82%99
後者は、表現される文字は3つなのに、文字コードは5つあります。
最後の % 付の文字列は、その上の文字/コードが、パーセントエンコーディング (URL エスケープ) で表現されたものです。これは URL の記述には使えない規格外の文字を表現するためのもので、本件では feeds.rdf 内に
mailbox://nobody@Feeds/%E3%83%96%E3%83%AD%E3%82%B0
のような形で記述されています。
同様に「スラド」の場合は次のように表現できます。
[ス][ラ][ド]
[30B9][30E9][30C9]
%E3%82%B9%E3%83%A9%E3%83%89
[ス][ラ][[ト][゙]]
[30B9][30E9][[30C8]+[3099]]
%E3%82%B9%E3%83%A9%E3%83%88%E3%82%99
(簡単な方法で文字の表示を確かめる=1)
feeds.rdf にある
mailbox://nobody@Feeds/%E3%82%B9%E3%83%A9%E3%83%89
または
mailbox://nobody@Feeds/%E3%82%B9%E3%83%A9%E3%83%88%E3%82%99
の URL を、Firefox のロケーションバーに入力して実行してみてください。
「アドレスのプロトコルが不明です」とエラーが出ますが、ロケーションバーの表示が変化するのがわかると思います。
URL エスケープが元に戻され、どちらも
mailbox://nobody@Feeds/スラド
となり、見た目は違いがわからないはずです。
今度は、ロケーションバーから「スラド」の3文字だけを選択・コピーし、適当なテキストエディタにペーストすると、「スラド」の文字のまま表示されます。
そのテキストエディタが Unicode に十分対応していれば、どちらも「スラド」と表示されると思いますが、対応が不十分なテキストエディタ(あるいは選択しているフォントによって)では、最後が [ト]+[゙] か、[ト]+[?] のように濁点部分が文字化けしたように表示されると思います。
(簡単な方法で文字の表示を確かめる=2)
~ \Mail\Feeds 内にある「スラド」という拡張子のないファイル(フィード記事を保存した実体ファイル)を、Firefox にドロップすると、ロケーションバーに URL が表示されます。次のようにです。
file:///C:/Users/<username>/AppData/Roaming/Thunderbird/Profiles/xxxxxxxx.default/Mail/Feeds/%E3%82%B9%E3%83%A9%E3%83%89
最後の URL エスケープされたものが、ドロップしたファイル名を表します。
見た目は同じでも、ファイル名がどのようにつけられているかで、URL エスケープされた文字列が変わります。
例示した「ブログ」「スラド」以外でも、実際に存在するファイルを Firefox にドロップすることで、feeds.rdf の mailbox://nobody@Feeds/ 以下をどう書けばいいかを割り出せるかと思います。
以上は Windows 環境での話なので、Mac 環境に置き換えて解釈してください。
> meeyar さん
解決策につながる話ではなく単に本件で起こっていることの補足に過ぎませんが、上記のうち別トピック用に Mac ユーザー向けの説明として使える内容があれば、自由にアレンジしてお使いください。