サンプル・プログラムの実行例
サンプル・プログラム
CES.php | サンプル・プログラム |
準備
0039: //JIS X 0123:2004コード表
0040: // ラトルズ刊『文字コード【超】研究 改訂第2版』のサンプルデータ
0041: // https://query1000.com/chrc/data.htmlを参照
0042: define('FILE_JISX0213', 'jisx0213-2004-std2.txt');
0043:
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: }
前述の通り、文字を 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, $encode, INTERNAL_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 .= ' ';
0248: }
0249:
0250: return $outstr;
0251: }
コード変換した結果を、組み込み関数 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 .= ' ';
0223: }
0224:
0225: return $outstr;
0226: }
参考書籍
参考サイト
- シフトJISコードと ASCIIコードの共存:ぱふぅ家のホームページ
- EUC-JP と Linux:ぱふぅ家のホームページ
- JIS X 0212 と JIS X 0213:ぱふぅ家のホームページ
- ISO-2022-JP と電子メール:ぱふぅ家のホームページ
- Unicode=古今東西のあらゆる文字を収録:ぱふぅ家のホームページ
- UCS と UTF:ぱふぅ家のホームページ
そこで今回は、入力したテキストを、JISコード、シフトJISコード、EUC-JPコード、UCS-4、UTF-16、UTF-8、ISO-2022-JP で表したときの文字コードを一覧表示するPHPプログラムをつくってみることにする。
(2021年7月11日)PHP8対応,リファラ・チェック改良