PHPまとめ - 日本語を扱う

HOME | TOP

■ 概要

日本語を扱う私たちには文字コードという厄介な問題があります。

アルファベット圏の国とは違い、1文字が1バイトとは限らないので漢字コードやマルチバイトなどと言ったりします。

マルチバイトを扱う関数群は「mb_」で始まります。


■ 対応している文字コード

ASCIIとUTF-8はもちろん、他にも対応文字コードがあります。

▼ 対応文字コードを確認

[表示結果]

使えそうな目ぼしいものをピックアップすると上記のようになります。

日本語EUCを扱う場合は「CP51932」を、JISを扱う場合には「JIS」を、シフトJISを扱う場合には「SJIS-win」を使ったほうがより多くの依存文字にも対応できるようです。


■ 3つの内部エンコーディング

▼ マルチバイト関連全体の内部エンコーディングはこれで設定または取得できる。



▼ 正規表現用のエンコーディングを設定

設定したエンコーディングに基づいた挙動をするようになる。これが設定されていなければ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));
と書くのがいいように思います。


▼ 与えたスカラー変数や配列をすべて変換

変換処理の際には内部で一つにして、より精度の高い変換を行うとか

なので複数の変数を渡す場合は元の文字コードが何なのか知らなくとも、同じであることが前提となる。



▼ かなカナ変換

内部エンコーディングを前提とした変換を行う。内部エンコーディングとは別の文字コードなら第三引数に指定できる。



▼ 大小文字間の変換

内部エンコーディングを前提とした変換を行う。内部エンコーディングとは別の文字コードなら第二引数に指定できる。


■ 探索(サーチ、マッチ)

▼ 指定した文字が最初に現れる位置を返す

第三・第四にオフセット位置と文字コード指定ができます。

同系統の関数は以下のとおり

■ 分割

パターンで分割してその配列を返す

preg_split()に似てる。pregの方が使いやすそうな気が・・


■ 指定幅で丸める

表示したいけど長すぎて全部は表示できないようなとき、指定した長さで切ってくれる。

第四・第五引数には、末尾に付加したい文字および文字コード指定ができる。


■ 文字数を得る

第二引数に文字コード指定ができる。


■ 部分文字列

第四引数に文字コード指定ができる。


2010(C)Mingw