この質問は恥ずかしいほど簡単に見えますが、答えを見つけることができませんでした。
次のコードのC#行に相当するPHPは何ですか?
string str = "\u1000";
このサンプルは、「Unicode数値」が16進数で1000(10進数で4096)である単一のUnicode文字で文字列を作成します。
つまり、PHPで「Unicode数値」がわかっている単一のUnicode文字を含む文字列を作成するにはどうすればよいですか?
この質問は恥ずかしいほど簡単に見えますが、答えを見つけることができませんでした。
次のコードのC#行に相当するPHPは何ですか?
string str = "\u1000";
このサンプルは、「Unicode数値」が16進数で1000(10進数で4096)である単一のUnicode文字で文字列を作成します。
つまり、PHPで「Unicode数値」がわかっている単一のUnicode文字を含む文字列を作成するにはどうすればよいですか?
回答:
JSONは\uxxxx
構文を直接サポートしているため、最初に頭に浮かぶのは次のとおりです。
$unicodeChar = '\u1000';
echo json_decode('"'.$unicodeChar.'"');
別のオプションは使用することです mb_convert_encoding()
echo mb_convert_encoding('က', 'UTF-8', 'HTML-ENTITIES');
または、UTF-16BE(ビッグエンディアン)とUnicodeコードポイント間の直接マッピングを利用します。
echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');
\uxxxx
Unicode構文をサポートしているため、を使用json_decode
して、人為的に作成されたJSON文字列表現を操作できます。それを明確にするために私は言い回しを変えました。
echo json_decode('"\u201B"');
です。Unicodeシンボルを囲む二重引用符は必須です。
PHP 7.0.0では、「Unicodeコードポイントエスケープ」構文が導入されています。
関数を呼び出さずに、二重引用符またはヒアドキュメント文字列を使用して、Unicode文字を簡単に書き込むことができるようになりました。
$unicodeChar = "\u{1000}";
なぜ誰もこれについてまだ言及していませんが、二重引用符で囲まれた文字列のエスケープシーケンスを使用して、ほぼ同等のバージョンを実行できます。
\x[0-9A-Fa-f]{1,2}
正規表現に一致する文字のシーケンスは、16進表記の文字です。
ASCIIの例:
<?php
echo("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21");
?>
"こんにちは世界"
したがって、あなたの場合、あなたがする必要があるのはです$str = "\x30\xA2";
。ただし、これらは文字ではなくバイトです。Unicodeコードポイントのバイト表現はUTF-16ビッグエンディアンと一致するため、次のように直接出力できます。
<?php
header('content-type:text/html;charset=utf-16be');
echo("\x30\xA2");
?>
ア
別のエンコーディングを使用している場合は、それに応じてバイトを変更する必要があります(大部分はライブラリで行われますが、手動でも可能です)。
UTF-16リトルエンディアンの例:
<?php
header('content-type:text/html;charset=utf-16le');
echo("\xA2\x30");
?>
ア
UTF-8の例:
<?php
header('content-type:text/html;charset=utf-8');
echo("\xE3\x82\xA2");
?>
ア
pack
機能もありますが、遅いと思われます。
PHPはこれらのUnicodeエスケープシーケンスを認識しません。ただし、不明なエスケープシーケンスは影響を受けないため、このようなUnicodeエスケープシーケンスを変換する独自の関数を作成できます。
function unicodeString($str, $encoding=null) {
if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', create_function('$match', 'return mb_convert_encoding(pack("H*", $match[1]), '.var_export($encoding, true).', "UTF-16BE");'), $str);
}
または、次の代わりに無名関数式を使用しcreate_function
ます。
function unicodeString($str, $encoding=null) {
if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', function($match) use ($encoding) {
return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE');
}, $str);
}
その使用法:
$str = unicodeString("\u1000");
Portable UTF-8を試してください。
$str = utf8_chr( 0x1000 );
$str = utf8_chr( '\u1000' );
$str = utf8_chr( 4096 );
すべてがまったく同じように機能します。で文字のコードポイントを取得できますutf8_ord()
。ポータブルUTF-8の詳細を読んでください。
他の人が述べたように、PHP 7 \u
ではUnicode構文のサポートが直接導入されています。
他の人にも言及されているように、PHPの賢明なUnicode文字記述から文字列値を取得する唯一の方法は、それを別のもの(JSON解析、HTML解析、またはその他の形式など)から変換することです。ただし、これには実行時のパフォーマンスコストが伴います。
ただし、他に1つのオプションがあります。\x
バイナリエスケープを使用して、PHPで文字を直接エンコードできます。\x
エスケープ構文もされたPHP 5でサポートされています。
これは、文字を自然な形で文字列に直接入力したくない場合に特に便利です。たとえば、それが目に見えない制御文字である場合、または空白を検出するのが難しい他の場合です。
まず、証明の例:
// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = " ";
$realChar = html_entity_decode($htmlEntityChar);
$phpChar = "\xE2\x80\x8A";
echo 'Proof: ';
var_dump($realChar === $phpChar); // bool(true)
Pacerierが別の回答で述べたように、このバイナリコードは特定の文字エンコーディングに固有であることに注意してください。上記の例で\xE2\x80\x8A
は、はUTF-8でのU + 200Aのバイナリコーディングです。
次の質問は、どのようにから入手できますさU+200A
に\xE2\x80\x8A
?
以下は、ネイティブ文字列として取得したJSON文字列、HTMLエンティティ、またはその他のメソッドに基づいて、任意の文字のエスケープシーケンスを生成するPHPスクリプトです。
function str_encode_utf8binary($str) {
/** @author Krinkle 2018 */
$output = '';
foreach (str_split($str) as $octet) {
$ordInt = ord($octet);
// Convert from int (base 10) to hex (base 16), for PHP \x syntax
$ordHex = base_convert($ordInt, 10, 16);
$output .= '\x' . $ordHex;
}
return $output;
}
function str_convert_html_to_utf8binary($str) {
return str_encode_utf8binary(html_entity_decode($str));
}
function str_convert_json_to_utf8binary($str) {
return str_encode_utf8binary(json_decode($str));
}
// Example for raw string: Unicode Character 'INFINITY' (U+221E)
echo str_encode_utf8binary('∞') . "\n";
// \xe2\x88\x9e
// Example for HTML: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_html_to_utf8binary(' ') . "\n";
// \xe2\x80\x8a
// Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
// \xe2\x80\x8a