[広告]
声とことばの磯貝メソッド
ヴォイスチェックサービス

波ダッシュ問題

波ダッシュ問題というのがある。有名といえば有名だが、普通の人は知らなくても別に馬鹿にされることはない。検索すれば説明しているページは山ほど出てくるのだが、的を射たページは少ないようなのだ。朗読.netでもまじめに対応しなければいけないと思って、自分なりの解釈を整理してメモしておく。

※後日書いた「よくわかる波ダッシュ問題」の方が纏まっているので、お急ぎの方はそちらをご覧ください。

現象

  1. 波ダッシュが「潤オ」に文字化けする。
    (IEがEUCの0x8FA2B7を受けると「潤オ」と表示する)
  2. 全角チルダが「?」に文字化けする。
    (cgiスクリプト等がユニコードの全角チルダをsjisに変換できずに未定義を意味する「?」を表示する)
  3. Windowsで波ダッシュ〜が逆さ(左から右へ下がって上がる。以下、逆ニョロ)に表示される。
    (Vista以降は正しく表示)

定義

波ダッシュ(WAVE DASH)〜(←これが逆ニョロになっていたらあなたは被害者)
左から右へ上がって下がる波線・ニョロ。
全角チルダ(FULLWIDTH TILDE)~
「Ã」のような文字の上に付くチルダ「~」を全角にしたもの。波ダッシュと同様の波線。何に使うのか不明。せめてニョロが上に位置しているのなら分かるが、真ん中なのだ。
続きを読む
posted by rodoku_ole at 2009-03-24 | Comment(0) | TrackBack(0) | 開発日記

波ダッシュ問題 続編

前記事で「たとえWindowsで表示が崩れても、波ダッシュ(の類)は波ダッシュで統一」という意味の結論を書いた。しかし、やはりと考え直している。このサイトを訪れるのはおもに朗読に関わる人達だろう。その中に正しいコードにこだわる人はほとんどいないはずだ。それよりも、きれいな活字を読み慣れた文学好きの朗読関係者にあの不恰好な逆ニョロは堪えられないのではないかと思う。なので、やはり強制的に全角チルダにしてしまおうかとも考え直している。だいたい全角チルダなんて誰が使うのか。ほぼ100%、波ダッシュのつもりで入力されたものではないか。本来の全角チルダと波ダッシュのつもりの全角チルダとが混在してトラブルになるなどということはないはずだ。

そこで、強制的に全角チルダにする以外に、Windowsで表示が崩れないための手段を考えてみた。

  1. クライアントへの出力時はキャラクタセットをshift_jisにして、波ダッシュだろうが全角チルダだろうが0x8160に変換。
  2. クライアントのOSを調べて、(XP以前の)Windowsなら、&#65374に変換。
  3. &#12316の部分を逆ニョロにならないフォントを指定したタグでくくる。
3番目は駄目みたい。そんなフォント見つからなかった。
1番目はありかもしれない。中はutf-8ですべてU+301C化、外はsjis。どうせ出入口でutf-8フラグを立てたり落としたりするのだからほとんど変わらない。いけるか?

posted by rodoku_ole at 2009-03-28 | Comment(0) | TrackBack(0) | 開発日記

よくわかる波ダッシュ問題

波ダッシュ問題のことをいろいろ書いたのだが、やっぱり要点を突いていないような気がしたので今度こそズバリと書きたい。

  1. 波ダッシュと全角チルダのコードをめぐる世界は「Windowsの世界」と「Windows以外の世界」に分類できる。
  2. それぞれの世界で閉じている分にはなんら問題はない。
  3. Windowsはshift_jisの世界であり、その世界においては0x8160の波ダッシュしか存在せず、全角チルダは存在しない。
  4. Windowsが外の世界とsjis以外で関わる時に問題が起きる。
  5. Windowsがユニコードで波ダッシュ(U+301C、文字参照の&#12316、utf-8の0xE3809C)をもらうと逆ニョロを表示する。(XPまで)
  6. Windowsがユニコードで全角チルダ(U+FF5E、文字参照の&#65374、utf-8の0xEFBD9E)をもらうと波ダッシュとして認識する。(おそらく内部ではshift_jisの0x8160に変換している)
  7. WindowsがEUC-JPで全角チルダ(0x8FA2B7)をもらうと「潤オ」と表示する。
  8. Windowsが波ダッシュをユニコードで送る場合に全角チルダ(U+FF5E、utf-8の0xEFBD9E)にして送る
  9. ちなみに、Windowsが波ダッシュをEUC-JPで送る場合は0xA1C1(波ダッシュ)で送る。(問題なし)
  10. Windows以外がユニコードからsjisに変換する場合に、全角チルダはsjisでは未定義なので「?」等の文字に置き換える。
例えるなら、「みかん」は分かるが「オレンジ」と「レモン」を間違っておぼえてるお婆ちゃんみたいなもんだ。

最初の記事でマッピングの表を書いたが、少し訂正。

Windows以外の世界
unicode文字参照utf-8eucsjis
波ダッシュU+301C&#123160xE3809C0xA1C10x8160
全角チルダU+FF5E&#653740xEFBD9E0x8FA2B7-

Windowsの世界
sjiseucunicode
波ダッシュ0x8160
(正ニョロ)
0xA1C1
(正ニョロ)
U+FF5E
(正ニョロ)
unicodeの波ダッシュ--U+301C
(逆ニョロ)
(未定義)-0x8FA2B7
(潤オ)
-

まだ続きそうだな、こりゃ。

posted by rodoku_ole at 2009-04-07 | Comment(0) | TrackBack(0) | 開発日記