13

次のような Unicode テキストブロックがあります。

ụ
ư
ứ
Ỳ
Ỷ
Ỵ
Đ

ここで、この元の Unicode テキスト ブロックを UTF-8 (HEX) コード ポイントのテキスト ブロックに変換したいと思います (このページの16 進 UTF-8列を参照してください: https://en.wikipedia.org/wiki /UTF-8 )、by PHP; このような:

\xe1\xbb\xa5
\xc6\xb0
\xe1\xbb\xa9
\xe1\xbb\xb2
\xe1\xbb\xb6
\xe1\xbb\xb4
\xc4\x90

このようではありません

0x1EE5
0x01B0
0x1EE9
0x1EF2
0x1EF6
0x1EF4
0x0110

PHPでそれを行う方法はありますか?


このトピック ( PHP: Convert unicode codepoint to UTF-8 ) を読みました。しかし、それは私の質問に似ていません。


申し訳ありませんが、私はあまり知りませんUnicode

4

3 に答える 3

13

bin2hex() 関数を探していると思います:

バイナリ データを 16 進数表現に変換する

\xそして、各バイトの先頭に追加してフォーマットします ( 00-FF )

function str_hex_format ($bin) {
  return '\x'.implode('\x', str_split(bin2hex($bin), 2));
}

サンプルの場合:

// utf8 encoded input
$arr = ["ụ","ư","ứ","Ỳ","Ỷ","Ỵ","Đ"];

foreach($arr AS $v)
  echo $v . " => " . str_hex_format($v) . "\n";

eval.in でテストを参照してください(リンクの有効期限が切れています)

ụ => \xe1\xbb\xa5
ư => \xc6\xb0
ứ => \xe1\xbb\xa9
Ỳ => \xe1\xbb\xb2
Ỷ => \xe1\xbb\xb6
Ỵ => \xe1\xbb\xb4
Đ => \xc4\x90

デコード例:$str = str_hex_format("ụưứỲỶỴĐ"); echo $str;

\xe1\xbb\xa5\xc6\xb0\xe1\xbb\xa9\xe1\xbb\xb2\xe1\xbb\xb6\xe1\xbb\xb4\xc4\x90

echo hex2bin(str_replace('\x', "", $str));

ụưứỲỶỴĐ</p>


二重引用符で囲まれた文字列のエスケープ シーケンス の詳細については、 php マニュアルを参照してください。\x

于 2015-07-22T06:01:46.207 に答える
3

PHP は、エンコーディングに関係なく、文字列を文字の配列として扱います。UTF8 文字を区切る必要がない場合は、次のように機能します。

$str='ụưứỲỶỴĐ';
foreach(str_split($str) as $char)
  echo '\x'.str_pad(dechex(ord($char)),'0',2,STR_PAD_LEFT);

出力:

\xe1\xbb\xa5\xc6\xb0\xe1\xbb\xa9\xe1\xbb\xb2\xe1\xbb\xb6\xe1\xbb\xb4\xc4\x90

UTF8 文字を (つまり、改行で) 区切る必要がある場合は、次のようなものが必要になります。

$str='ụưứỲỶỴĐ';
foreach(array_slice(preg_split('~~u',$str),1,-1) as $UTF8char){ // split before/after every UTF8 character and remove first/last empty string
  foreach(str_split($UTF8char) as $char)
    echo '\x'.str_pad(dechex(ord($char)),'0',2,STR_PAD_LEFT);
  echo "\n"; // delimiter
}

出力:

\xe1\xbb\xa5
\xc6\xb0
\xe1\xbb\xa9
\xe1\xbb\xb2
\xe1\xbb\xb6
\xe1\xbb\xb4
\xc4\x90

preg_splitこれは、uフラグを使用して文字列を UTF8 文字に分割します。preg_split最初の文字の前に空の文字列を返し、最後の文字の後に空の文字列を返すため、最初と最後の文字が必要ですarray_slice。これは、たとえば、配列を返すように簡単に変更できます。

編集: これを行うためのより「正しい」方法は次のとおりです。

echo trim(json_encode(utf8_encode('ụưứỲỶỴĐ')),'"');
于 2015-07-25T01:31:09.193 に答える