1

PHPでUTF-16BE形式の文字列をエンコードするにはどうすればよいですか?「デモメッセージ!!!」エンコードされた文字列は「00440065006D006F0020004D00650073007300610067006」である必要があります。また、アラビア文字をこの形式にエンコードする必要があります。

4

2 に答える 2

5

まず第一に、これは絶対に 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 では、私が示した例でわかるように、D1 バイトのみに格納されます: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-出力=を読みやすくするためにそこに入れます)

于 2010-05-01T10:27:20.903 に答える
0

たとえば、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]));
}
于 2010-05-01T10:33:21.777 に答える