PHPで文字を数値文字参照の形式に変換する

1.mb_convert_encodingでHTML-ENTITIESに変換する
http://www.php.net/manual/ja/function.mb-convert-encoding.php

  1. $str = "ABCDEあいうえお";
  2. $str = mb_convert_encoding($str, "HTML-ENTITIES", "UTF-8");
  3. echo $str;

実行結果)
ABCDEあいうえお


2.mb_encode_numericentity関数を使う
http:/www.php.net/manual/ja/function.mb-encode-numericentity.php

$convmapの配列は (開始コード, 終了コード, オフセット, マスク) がワンセットで、複数指定可能。
・開始コード:変換するコード領域の始まり。例えば0x80とすると0x00~0x7fの範囲は変換されない。
・終了コード:変換するコード領域の終わり。
・オフセット:先頭からの距離。例えば0x1とすると符号位置が1ずれた結果が返ってくる。
・マスク:値を取り出すために用いるビットパターン。2進数で、取り出したいビットを1としたデータ。
 例えば0xff(0b11111111)だと取り出される値は8ビット。
 (0x=16進数であることを示す/0b=2進数であることを示す/何もない場合は10進数)

  1. $str = "ABCDEあいうえお";
  2. $convmap = array(0x000000, 0x10ffff, 0, 0x1fffff);
  3. $str = mb_encode_numericentity ($str, $convmap, "UTF-8");
  4. echo $str;

実行結果)
ABCDEあいうえお


3.UTF-32のバイナリデータ化→bin2hexで16進数に変換(1)
mb_strlen(http://www.php.net/manual/ja/function.mb-strlen.php)で文字列の長さを取得して1文字ずつ処理
  1. $str = "ABCDEあいうえお";
  2. $len = mb_strlen($str, "UTF-8");
  3. for($n=0;$n<=$len-1;$n++){
  4. $utf32 = mb_convert_encoding(mb_substr($str, $n, 1, "UTF-8"), "UTF-32", "UTF-8");
  5. echo '&#x'.ltrim(bin2hex($utf32), 0).';';
  6. }

実行結果)
&#x41;&#x42;&#x43;&#x44;&#x45;&#x3042;&#x3044;&#x3046;&#x3048;&#x304a;

mb_convert_encoding:文字エンコーディングの変換に使用
http:///www.php.net/manual/ja/function.mb-convert-encoding.php
bin2hex:バイナリデータを16進数値に変換するのに使用
http://www.php.net/manual/ja/function.bin2hex.php
ltrim:先頭のゼロを削除するのに使用
http://www.php.net/manual/ja/function.ltrim.php


4.UTF-32のバイナリデータ化→bin2hexで16進数に変換(2)
preg_splitで1文字ずつ分割して処理
例2 文字列を文字要素に分割

<?php
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
?>
引用元:PHP(http://www.php.net/manual/ja/function.preg-split.php)

マルチバイト文字を扱う場合は、パターン修飾子のu(UTF-8としてパターンマッチ)を使用

  1. $str = "ABCDEあいうえお";
  2. $result = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
  3. mb_convert_variables("UTF-32", "UTF-8", $result);
  4. foreach($result as &$value){
  5. $value = ltrim(bin2hex($value), 0);
  6. }
  7. unset($value);
  8. echo '&#x'.implode(';&#x', $result).';';

実行結果)
&#x41;&#x42;&#x43;&#x44;&#x45;&#x3042;&#x3044;&#x3046;&#x3048;&#x304a;

mb_convert_variables:配列の文字エンコーディングを変換するのに使用
http://www.php.net/manual/ja/function.mb-convert-variables.php


5.その他の方法
UTF-32のバイナリデータをunpackするとか。
http://www.php.net/manual/ja/function.unpack.php