文字コードで気をつけること

multibyte

よく「JIS(ISO-2022-JP)」と表現されますが、PHPでは「ISO-2022-JP」と「JIS」は違う文字コードになります。
「ISO-2022-JP」はメールでよく使われる文字コードで規格を厳守してるので機種依存文字(ISO-2022-JP規定外文字)や半角カナ共に扱えません。
一方「JIS」は半角カナが使え、機種依存文字が扱えない。
八方ふさがりのように見えるがPHP5.2.1からは「ISO-2022-JP-MS」が用意されており、コレだと機種依存文字も半角カナも扱える。
「メールはJISだから機種依存文字や半角カナが送信出来ない」はずだが、ISO-2022-JPのふりして中身をISO-2022-JP-MSにすると機種依存文字が送れたりします。(受け手のメールソフトが対応してた場合のみですが・・・)

このように元の規格を拡張したものは他にも多くあり、有名な所で
「SJIS」と「SJIS-win」
「EUC-JP」と「eucJP-win」と「CP51932」
といったものがある。

SJISだと「¥」(0x5C) を検索すると「表」(0x95 0x5C) にマッチしてしまったり
EUC-JPだと「海」(0xB3 0xA4) を検索すると「ここ」(0xA4 0xB3 0xA4 0xB3) にマッチしてしまったりする。
そのため低速なマルチバイトに対応した関数(mb_)を利用する必要があった。
それがUTF-8が全盛の時代になって文字コード問題に対して配慮する必要が減ったが無くなった訳では無い。

BOM問題

文章ファイルを保存時にBOM(Byte Order Mark)と呼ばれる「0xEF 0xBB 0xBF」の3バイト文字を付けるか付けないかで、BOMありを「UTF-8」としBOMなしを「UTF-8N」と呼んだりする。Linux系のスクリプト(PHP等)ではファイルの先頭の文字にBOMがあると正常に動かないし逆にMicrosoft製のソフトではBOMが無いと正常に動かない。

〜 (波ダッシュ)問題

波ダッシュ – Wikipediaに詳しく書かれてるが古いWindowsのアプリで編集すると〜が消えてしまう。

UTF-8 4バイト問題

UTF-8に対応してると言ってもソフトによっては3バイトまでしか対応していなかったりする。
例えば「辰𠮷𠀋一郎」の𠮷(吉)と𠀋(丈)といった4バイト文字を扱おうとすると、個人的に愛用してる「Mery」も少し前のバージョンは表示できなかったし、人気DB「MySQL」もちょっと前まで未対応だった。MySQLの場合はRDS MySQL5.5.33 で『utf8mb4』(4バイト対応UTF-8文字コードセット)を試してみたを試してみたの通りすると対応出来るらしい。MySQLのバージョンや設定が変えられない場合は該当文字を実体参照にして格納する方法もあります。

Tags: , , ,

トラックバック

コメントを書く