Safariがチルド(チルダ)を波ダッシュに変換するのはやっぱりおかしいと思う件

背景


よく知られているように、Shift_JISのページにフォーム送信する際、Safariはチルド(U+007e TILDE)を波ダッシュShift_JIS 0x8160)に変換する。なぜわざわざこんなことをするのかというと、たぶん、以下のような考えに基づいているのだろう。

MacJapaneseの0x7eはチルドだが、(IANAに登録されている)Shift_JISの0x7eはオーバーラインである。Shift_JISにはチルドが存在しない。チルドが存在しないShift_JISのページにチルドを渡すことはできない。「?」を渡すよりは、似た形の波ダッシュに変換したほうがいくらかマシである。

第1の論点:チルドとオーバーラインの交換可能性


しかし、似た形だからというだけでは、理由として弱い。いずれにせよある程度のブレが避けられないのであれば、MacJapaneseの0x7e(チルド)をShift_JISの0x7e(オーバーライン)と同一視するほうが筋が通っているのではないか。

IANAにおけるShift_JISの定義はJIS X 0208:1997におけるシフト符号化表現を参照しており、シフト符号化表現はJIS X 0201を参照している。そしてJIS X 0201:1997には「OVER LINEの字形の許容範囲」として、送信者と受信者との間で明示的な合意がある場合、OVER LINEにTILDEと同じ字形を使用してもよいと記されている。

この点から、チルドのマッピング先は、波ダッシュShift_JIS 0x8160)ではなくオーバーライン(Shift_JIS 0x7e)とするのが自然であるように思われる。

第2の論点:往復の一貫性・主張の一貫性


Safariは、Shift_JISのページにおける0x7e(オーバーライン)を、チルドとして表示する。すなわち、Shift_JISからUnicodeへの変換において、(Unicodeにはオーバーラインが存在するにもかかわらず)オーバーラインをチルドに置き換えている。これは、フォーム送信時の動作と矛盾する。

「オーバーラインとチルドは異なる」という主張があるのなら、Shift_JISのページにおける0x7e(オーバーライン)をオーバーラインとして表示するのでなければおかしい。

逆に、Shift_JISのページにおける0x7e(オーバーライン)をチルドとして表示してよいと考えるのであれば、フォーム送信時にもチルド(U+007e TILDE)をShift_JISの0x7e(オーバーライン)にマッピングすればいい。往復を繰り返しても符号が変わらないという意味では、このマッピングが最も安定している。

ちなみに、知っていても何の役にも立たない豆知識だが、SafariShift_JISのページのフォームから(普通にやったのでは波ダッシュに化けてしまう)チルドを投稿するには、U+00U+203e OVERLINEを入力すればいい。SafariはこれをShift_JIS 0x7eにマッピングし(往路)、それをU+007e TILDEとして表示する(復路)。

第3の論点:利用者の利便性


利用者の利便性を優先することで、整合性を欠いた実装となってしまう例は珍しくない。しかし、チルドをオーバーラインでなく波ダッシュマッピングするというSafariの仕様が、利用者にどのようなメリットをもたらすのか、わたしにはわからない。一方、「フォームに投稿したURLの一部が波ダッシュに変換されたためにリンクとして機能しなくなった」というような話は、何度も繰り返されている。

そんなわけで


ウェブ上の掲示板などで「どうしてこんなことになるのか?」という質問が出た場合、詳しい人から「いろいろ複雑な事情によってこうなっているのであって、Safariの仕様が間違っているわけではない」といったような説明がなされるのが常で、わたしとしてはどうも納得いかないので、とりあえず考えていることを叩き台として公開してみる。突っ込み歓迎。

今のところ、「現状のSafariの仕様はおかしいので、Shift_JISのページにフォーム送信する際、チルド(U+007e TILDE)をオーバーライン(Shift_JIS 0x7e)にマッピングするよう直してください」が結論。