日本語を扱う私たちには文字コードという厄介な問題があります。
アルファベット圏の国とは違い、1文字が1バイトとは限らないので漢字コードやマルチバイトなどと言ったりします。
マルチバイトを扱う関数群は「mb_」で始まります。
ASCIIとUTF-8はもちろん、他にも対応文字コードがあります。
▼ 対応文字コードを確認
[表示結果]
使えそうな目ぼしいものをピックアップすると上記のようになります。
日本語EUCを扱う場合は「CP51932」を、JISを扱う場合には「JIS」を、シフトJISを扱う場合には「SJIS-win」を使ったほうがより多くの依存文字にも対応できるようです。
▼ マルチバイト関連全体の内部エンコーディングはこれで設定または取得できる。
▼ 正規表現用のエンコーディングを設定
設定したエンコーディングに基づいた挙動をするようになる。これが設定されていなければmb_internal_encoding()値が使われる。
"JIS"指定はできないらしい。
▼ メールのメッセージエンコーディングとして使用される
メール関連の関数mail(), mb_send_mail()へ渡すメッセージのエンコーディングを知らせることで自動的に「Content-type」や「Content-Transfer-Encoding」ヘッダを付加させるようになる?
▼ 与えた文字列を文字コード変換して返す
元の文字コードを認識できていなくても、カンマ区切りで複数指定できるので確率の高そうなものから順に書いておけばよい。
よくあるシフトJISの半角カタカナと日本語EUCの漢字の間で起こる文字コードの誤判別問題を考慮して、シフトJISを先に書いておきます。
というのは半角カタカナのみで送られてくる可能性が、漢字(しかも単独であまり使わない領域)のみで送られてくる可能性よりも高いのと、私の場合はシフトJISでページ表示するのでシフトJISで送られてくることがほとんどだから・・ という理由です。
上記はわたしの認識が間違っていました。
文字コードリストを指定する使い方として、まず先に"ASCII,JIS,UTF-8"の順で書いておかないとうまく判別できないようです。
なので
$jcode = mb_detect_encoding($s, "ASCII,JIS,UTF-8,CP51932,SJIS-win", true);
が一番的確な判断をしてくれそうです。したがってエンコード時には
$s = mb_convert_encoding($s, "SJIS-win", mb_detect_encoding($s, "ASCII,JIS,UTF-8,CP51932,SJIS-win", true));
と書くのがいいように思います。
▼ 与えたスカラー変数や配列をすべて変換
変換処理の際には内部で一つにして、より精度の高い変換を行うとか
なので複数の変数を渡す場合は元の文字コードが何なのか知らなくとも、同じであることが前提となる。
▼ かなカナ変換
内部エンコーディングを前提とした変換を行う。内部エンコーディングとは別の文字コードなら第三引数に指定できる。
▼ 大小文字間の変換
内部エンコーディングを前提とした変換を行う。内部エンコーディングとは別の文字コードなら第二引数に指定できる。