PHPで文字コード表を作る

(1/1)
文字コードの話」では、さまざまな文字符号化方式を紹介している。
そこで今回は、入力したテキストを、JISコードシフトJISコードEUC-JPコードUCS-4UTF-16UTF-8ISO-2022-JP で表したときの文字コードを一覧表示するPHPプログラムをつくってみることにする。

(2021年7月11日)PHP8対応,リファラ・チェック改良

サンプル・プログラムの実行例

PHPで文字コード表を作る

目次

サンプル・プログラム

圧縮ファイルの内容
CES.phpサンプル・プログラム

準備

  39: //JIS X 0123:2004 コード表
  40: // ラトルズ刊『文字コード【超】研究 改訂第2版』のサンプルデータ
  41: // http://query1000.com/chrc/data.html を参照
  42: define('FILE_JISX0213', 'jisx0213-2004-std2.txt');
  43: 

PHPで文字コードを求めるには、組み込み関数  mb_convert_encoding  を利用する方針だ。ところが、この関数だけでは、いわゆる JISコード(面区点コード)を求めることができない。
EUC-JPシフトJISコードから逆算はできるのだが、それでは、JIS第3・第4水準漢字のコードが計算できない。

そこで、深沢千尋さんが著した『文字コード【超】研究 改訂第2版』(ラトルズ=刊)のサンプルデータとして公開されている JIS X 0213:2004 のコード表 "jisx0213-2004-std2.txt" を流用することにした。このファイルをダウンロードして、適当なフォルダに配置していただきたい。

解説:JISコードを求める

 185: /**
 186:  * JIS面区点コードを返す
 187:  * @param   string $ch 文字(INTERNAL_ENCODING)
 188:  * @return  string JIS面区点コード
 189: */
 190: function ch2kuten($ch) {
 191:     $infp = fopen(FILE_JISX0213, 'r');
 192:     while (! feof($infp)) {
 193:         $s = fgets($infp);
 194:         $arr = mb_split("\t", $s);
 195:         if (isset($arr[3]) && ($arr[3] == $ch)) {
 196:             preg_match('/[0-9]+\-[0-9]+\-[0-9]+/ui', $arr[0], $arr2);
 197:             return $arr2[0];
 198:         }
 199:     }
 200:     return '?';
 201: }

ユーザー関数 ch2kuten は、入力された文字に対する JISコード(面区点コード)を返す。

前述の通り、文字を JIS X 0213 コード表と照合し、合致した JISコード(面区点コード)を返す。

解説:文字コードを求める

 228: /**
 229:  * エンコードで指定された文字コードを返す(ch2codeの下請け)
 230:  * @param   string $ch 文字(INTERNAL_ENCODING)
 231:  * @param   string $encode エンコード
 232:  * @return  string 文字コード(16進数文字列)
 233: */
 234: function ch2code_sub($ch, $encode) {
 235:     $ch2 = mb_convert_encoding($ch, $encode, INTERNAL_ENCODING);
 236:     //変換エラー
 237:     if ($ch !'?' && $ch2 == '?')      return '?';
 238: 
 239:     //文字コード
 240:     $hex = bin2hex($ch2);
 241:     $hex = strtoupper($hex);
 242: 
 243:     $l = strlen($hex);
 244:     $outstr = '';
 245:     for ($i = 0$i < $l$i +2) {
 246:         $outstr .substr($hex, $i, 2);
 247:         $outstr .'&nbsp;';
 248:     }
 249: 
 250:     return $outstr;
 251: }

それ以外の文字符号化方式については、組み込み関数  mb_convert_encoding  を利用して文字コードを求める。

コード変換した結果を、組み込み関数  bin2hex  に入れると、その文字の16進コードを取得できる。表示の便宜上、1バイトごとに空白文字を入れておく。

解説:ISO-2022-JPコードを求める

 203: /**
 204:  * ISO-2022-JPコードを返す(エスケープは省く)
 205:  * @param   string $ch 文字(INTERNAL_ENCODING)
 206:  * @return  string ISO-2022-JPコード
 207: */
 208: function ch2iso2022jp($ch) {
 209:     $ch2 = mb_convert_encoding($ch, 'ISO-2022-JP', INTERNAL_ENCODING);
 210:     //変換エラー
 211:     if ($ch !'?' && $ch2 == '?')      return '?';
 212: 
 213:     //文字コード
 214:     $hex = bin2hex($ch2);
 215:     $hex = strtoupper($hex);
 216: 
 217:     $l = strlen($hex);
 218:     $start = ($l <4? 0 : 6;
 219:     $outstr = '';
 220:     for ($i = $start$i < $start + 4$i +2) {
 221:         $outstr .substr($hex, $i, 2);
 222:         $outstr .'&nbsp;';
 223:     }
 224: 
 225:     return $outstr;
 226: }

ISO-2022-JP コードについては、組み込み関数  mb_convert_encoding  の結果にエスケープシーケンスが含まれるため、これを除くためのユーザー関数 ch2iso2022jp を用意した。

参考書籍

表紙 文字コード「超」研究 改訂第2版
著者 深沢千尋
出版社 ラトルズ
サイズ 単行本
発売日 2011年07月
価格 3,828円(税込)
ISBN 9784899772934
定番のロングセラーが、Unicode6.0にも対応して完全リニューアル。ケータイ絵文字にも対応。
 

参考サイト

(この項おわり)
header