文字化けの代表でよく上がる、〇〇からを表現する時などにつかう「波線」と呼ばれる「~」や「〜」が実は環境で違う案件。
なんのこっちゃ分からなかったけど、ざっくり分かった。
「~」と「〜」が実は違う文字
まず、「~」と「〜」が実は違う文字であるということ。
何を言っているのか分からないだろうし、俺も最初ちょっと意味分からなかった。
「一」と「壱」は意味は同じだけど、見た目も違うし内部的に持っている文字コード番号も違う。
「~」と「〜」は意味は同じだし、見た目もほとんど同じだけど、内部的に持っている文字コード番号が違う。
やっぱり何を言っている分からないな。
以下は、フォントを変えてみた物を並べてみた。環境によるが、微妙に違ったりするのが分かるだろうか。
============================
sans-serif:「~」と「〜」
serif:「~」と「〜」
cursive:「~」と「〜」
fantasy:「~」と「〜」
monospace:「~」と「〜」
============================
ようは、「~」と「〜」は、見た目が全く同じか、微妙に違う別の文字である。
内部的には、前者がefbd9で後者がe3809cというユニコードで割り当てられており、まったくの別物である。
Windowsはefbd9でMacはe3809cが割り当てられている。
色んな理由や経緯などあるらしいけど、今でも決定的に違うのが、Windowsでニョロを打った場合はefbd9の「~」が使われ、Macでニョロを打つとe3809cの「〜」が使われる。
だから、WindowsユーザーのニョロがMac環境で文字化けしたり、Macユーザーのニョロは、サーバーにあげても文字化けしないとか、見え方が違うとかが発生する。
解決方法
完璧な解決方法はない。
外部サービスを通すと文字化けするなどは文字コードの変換で化けているので、こっちのサービスは大丈夫だけど、こっちはダメな時点で、どちらにも対応する方法が無い。
だが、サーバーに(データベース)に登録するタイミングやその他ファイルに吐き出す瞬間等で、文字化けしないどちらかの文字に置き換えることで、どちらかに寄せることは可能。
以下はPHPで文字を置き換える方法。
//WindowsのにょろをMacのにょろに置き換える $str = str_replace(hex2bin("EFBD9E"), hex2bin("E3809C"), $str);
直接、文字を変換してもいいがその場合分かりにくいのが欠点。
//WindowsのにょろをMacのにょろに置き換える。文字直接書き込み版 $str = str_replace('~', '〜', $str);
変換する際の文字化けなどは以下のサイト様が詳しく書いてあります。
www.unirita.co.jp/blog/data-utilization/data-linkage/20141021.html
「~」と「〜」は意味は同じ
ではなく、本来は異なる意味だが同じように使われているのが現状、ですね。
英語での範囲指定は ~ ではなく – だということを考えて日本語に当てはめれば理解できると思います。