PHPでUTF-16BE形式の文字列をエンコードするにはどうすればよいですか?「デモメッセージ!!!」エンコードされた文字列は「00440065006D006F0020004D00650073007300610067006」である必要があります。また、アラビア文字をこの形式にエンコードする必要があります。
2 に答える
まず第一に、これは絶対に UTF-8 ではありません。これは単なる文字セットです(つまり、文字列をメモリに保存/表示する方法)。
ここにあるものは、各キャラクターを構築するために使用されるバイトのダンプのように見えます.
もしそうなら、あなたはこの方法でそれらのバイトを得ることができます:
$str = utf8_encode("Demo Message!!!");
for ($i=0 ; $i<strlen($str) ; $i++) {
$byte = $str[$i];
$char = ord($byte);
printf('%02x ', $char);
}
そして、次の出力が得られます。
44 65 6d 6f 20 4d 65 73 73 61 67 65 21 21 21
しかし、繰り返しますが、これは UTF-8 ではありません: UTF-8 では、私が示した例でわかるように、D
1 バイトのみに格納されます:0x44
あなたが投稿したものでは、2つの Bytes : を使用して保存されています0x00 0x44
。
たぶん、ある種の UTF-16 を使用していますか?
もう少しテストしてから編集し、@aSeptik のコメント:これは確かに UTF-16 です。
取得している種類のダンプを取得するには、文字列が UTF-16 でエンコードされていることを確認する必要があります。これは、たとえば次のmb_convert_encoding
関数を使用して、この方法で行うことができます。
$str = mb_convert_encoding("Demo Message!!!", 'UTF-16', 'UTF-8');
次に、この文字列を作成するバイトを反復処理し、以前に行ったようにそれらの値をダンプするだけです。
for ($i=0 ; $i<strlen($str) ; $i++) {
$byte = $str[$i];
$char = ord($byte);
printf('%02x ', $char);
}
そして、次の出力が得られます。
00 44 00 65 00 6d 00 6f 00 20 00 4d 00 65 00 73 00 73 00 61 00 67 00 65 00 21 00 21 00 21
あなたが投稿したもののように見えるのはどれですか:-)
(呼び出しでスペースを削除するだけですprintf
-出力=を読みやすくするためにそこに入れます)
たとえば、mbstring拡張機能とそのmb_convert_encoding()関数を使用します。
$in = 'Demo Message!!!';
$out = mb_convert_encoding($in, 'UTF-16BE');
for($i=0; $i<strlen($out); $i++) {
printf("%02X ", ord($out[$i]));
}
版画
00 44 00 65 00 6D 00 6F 00 20 00 4D 00 65 00 73 00 73 00 61 00 67 00 65 00 21 00 21 00 21
または、iconv()を使用して
$in = 'Demo Message!!!';
$out = iconv('iso-8859-1', 'UTF-16BE', $in);
for($i=0; $i<strlen($out); $i++) {
printf("%02X ", ord($out[$i]));
}