PHPで文字コード表を作る

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

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

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

PHPで文字コード表を作る

目次

サンプル・プログラム

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

準備

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

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

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

解説:JISコードを求める

0185: /**
0186:  * JIS面区点コードを返す
0187:  * @param   string $ch 文字(INTERNAL_ENCODING)
0188:  * @return  string JIS面区点コード
0189: */
0190: function ch2kuten($ch) {
0191:     $infp = fopen(FILE_JISX0213, 'r');
0192:     while (! feof($infp)) {
0193:         $s = fgets($infp);
0194:         $arr = mb_split("\t", $s);
0195:         if (isset($arr[3]) && ($arr[3] == $ch)) {
0196:             preg_match('/[0-9]+\-[0-9]+\-[0-9]+/ui', $arr[0]$arr2);
0197:             return $arr2[0];
0198:         }
0199:     }
0200:     return '?';
0201: }

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

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

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

0228: /**
0229:  * エンコードで指定された文字コードを返す(ch2codeの下請け)
0230:  * @param   string $ch 文字(INTERNAL_ENCODING)
0231:  * @param   string $encode エンコード
0232:  * @return  string 文字コード(16進数文字列)
0233: */
0234: function ch2code_sub($ch$encode) {
0235:     $ch2 = mb_convert_encoding($ch$encodeINTERNAL_ENCODING);
0236:     //変換エラー
0237:     if ($ch != '?' && $ch2 == '?')     return '?';
0238: 
0239:     //文字コード
0240:     $hex = bin2hex($ch2);
0241:     $hex = strtoupper($hex);
0242: 
0243:     $l = strlen($hex);
0244:     $outstr = '';
0245:     for ($i = 0; $i < $l$i += 2) {
0246:         $outstr .= substr($hex$i, 2);
0247:         $outstr .= '&nbsp;';
0248:     }
0249: 
0250:     return $outstr;
0251: }

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

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

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

0203: /**
0204:  * ISO-2022-JPコードを返す(エスケープは省く)
0205:  * @param   string $ch 文字(INTERNAL_ENCODING)
0206:  * @return  string ISO-2022-JPコード
0207: */
0208: function ch2iso2022jp($ch) {
0209:     $ch2 = mb_convert_encoding($ch, 'ISO-2022-JP', INTERNAL_ENCODING);
0210:     //変換エラー
0211:     if ($ch != '?' && $ch2 == '?')     return '?';
0212: 
0213:     //文字コード
0214:     $hex = bin2hex($ch2);
0215:     $hex = strtoupper($hex);
0216: 
0217:     $l = strlen($hex);
0218:     $start = ($l <= 4) ? 0 : 6;
0219:     $outstr = '';
0220:     for ($i = $start$i < $start + 4; $i += 2) {
0221:         $outstr .= substr($hex$i, 2);
0222:         $outstr .= '&nbsp;';
0223:     }
0224: 
0225:     return $outstr;
0226: }

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

参考書籍

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

参考サイト

(この項おわり)
header