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

[開発日記] 波ダッシュ問題

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

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

現象

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

定義

波ダッシュ(WAVE DASH)〜(←これが逆ニョロになっていたらあなたは被害者)
左から右へ上がって下がる波線・ニョロ。
全角チルダ(FULLWIDTH TILDE)~
「Ã」のような文字の上に付くチルダ「~」を全角にしたもの。波ダッシュと同様の波線。何に使うのか不明。せめてニョロが上に位置しているのなら分かるが、真ん中なのだ。

原因

  1. sjisの世界には全角チルダはなく、波ダッシュしかなかった。
  2. ユニコードの仕様書の誤記。日本語に詳しくない人が逆ニョロの形で印刷したらしい。
  3. Windowsがユニコードを導入するときに、ユニコード全角チルダにsjis波ダッシュを対応させ、ユニコード波ダッシュにはsjisは対応させず、仕様書どおりの逆ニョロの形を採用した。 (つまり、sjisでは波ダッシュは入力・表示出来ず、ユニコードでコード化された波ダッシュは逆ニョロで表示される。多くのWindowsユーザは入力時は波ダッシュのつもりで全角チルダを使っているのだろう。)
unicode文字参照utf-8eucsjis(Win)
波ダッシュU+301C&#12316xE3809CxA1C1-
全角チルダU+FF5E&#65374xEFBD9Ex8FA2B7x8160波ダッシュ

perlモジュールの対応

sjisで0x8160(波ダッシュ)の文字列をutf8に変換してみた
  • Encode::decode 更にutf8::encode → 0xE3809C(波ダッシュ)
  • Encode::from_to → 0xE3809C
  • Jcode::convert → 0xE3809C

utf8で0xE3809C(波ダッシュ)の文字列をsjisに変換してみた
  • utf8::decode後Encode::encode → 0x8160(波ダッシュ)
  • Encode::from_to → 0x8160
  • Jcode::convert → 0x8160

utf8で0xEFBD9E(全角チルダ)の文字列をsjisに変換してみた
  • utf8::decode後Encode::encode → 0x3F(?)
  • Encode::from_to → 0x3F
  • Jcode::convert → 0x3F

対応

Windowsでの見た目が崩れないようにするのなら波ダッシュのコードをすべて全角チルダに変換してしまうという手もある。しかし、perlをはじめ世間は当たり前にsjis0x8160(波ダッシュ)→ユニコードU+301C(波ダッシュ)として扱っているようなのでそれに習おうか。
  • 自分がコーディングする場合は波ダッシュは波ダッシュのコードになるように書く。sjisで書かなければならない場合は文字参照&#12316にする。
  • 他所からsjis0x8160を受けたらperlに委ねる。→結果的にユニコードU+301C(波ダッシュ)になる。
  • 「潤オ」のパターンは波ダッシュに変換するかもしれない。

参考

posted by rodoku_ole at 2009-03-24 | Comment(0) | TrackBack(0) | 開発日記
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/27831265

この記事へのトラックバック