PHP字符串中的Unicode字符

PHP字符串中的Unicode字符,php,unicode,Php,Unicode,这个问题看起来简单得让人难堪,但我一直找不到答案 PHP与下面的C#行代码等价的是什么 string str = "\u1000"; 此示例使用单个Unicode字符创建一个字符串,该字符的十六进制“Unicode数值”为1000(4096) 也就是说,在PHP中,如何使用已知“Unicode数值”的单个Unicode字符创建字符串?因为JSON直接支持\uxxx语法我想到的第一件事是: $unicodeChar = '\u1000'; echo json_decode('

这个问题看起来简单得让人难堪,但我一直找不到答案

PHP与下面的C#行代码等价的是什么

string str = "\u1000";
此示例使用单个Unicode字符创建一个字符串,该字符的十六进制“Unicode数值”为
1000
4096


也就是说,在PHP中,如何使用已知“Unicode数值”的单个Unicode字符创建字符串?

因为JSON直接支持
\uxxx
语法我想到的第一件事是:

$unicodeChar = '\u1000';
echo json_decode('"'.$unicodeChar.'"');
另一个选项是使用
mb\u convert\u encoding()

或者利用UTF-16BE(big-endian)和Unicode代码点之间的直接映射:

echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');

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);
}
或使用替代的:

其用途:

$str = unicodeString("\u1000");
这也行得通。不过,json_decode()解决方案的速度要快得多(大约是50倍)。

试试:


所有的工作方式都完全相同。您可以使用
utf8\u ord()
获取字符的码点

我想知道为什么还没有人提到这一点,但您可以在中使用转义序列执行几乎相同的版本:

\x[0-9A-Fa-f]{1,2}

与正则表达式匹配的字符序列是 十六进制表示法中的字符

ASCII示例:

<?php
    echo("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21");
?>

如果您使用的是不同的编码,则需要相应地更改字节(大部分使用库完成,但也可以手动完成)

UTF-16 little endian示例:

<?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");
?>


还有这个函数,但您可以预期它会很慢。

PHP7.0.0引入了

现在可以通过使用或字符串轻松编写Unicode字符,而无需调用任何函数

$unicodeChar = "\u{1000}";

正如其他人提到的,PHP7直接引入了对Unicode语法的支持

正如其他人提到的,从PHP中任何合理的Unicode字符描述中获取字符串值的唯一方法是将其从其他形式(例如JSON解析、HTML解析或其他形式)转换。但这是以运行时性能为代价的

然而,还有一个选择。您可以使用
\x
二进制转义直接在PHP中对字符进行编码。PHP 5也支持转义语法
\x

如果您不希望通过字符串的自然形式直接在字符串中输入字符,这一点尤其有用。例如,如果它是一个不可见的控件字符,或其他难以检测的空白

首先,一个示例:

// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = "&#8202;";
$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

下面是一个PHP脚本,用于根据JSON字符串、HTML实体或任何其他方法生成任何字符的转义序列(一旦将其作为本机字符串)

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('&#8202;') . "\n";
// \xe2\x80\x8a

// Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
// \xe2\x80\x8a
$msg='67714EAC99C5002000054006F006B0079006F0020005300740006100740069006F006E003A0020'


回显unicode_到_文本字符串($str)

阅读:@diEcho:这只用于匹配Unicode字符,但OP希望创建这些字符。这可能会有所帮助:这个问题可能重复10年。公认的答案已经过时了。@Gumbo:我知道,但在这里没有任何区别。Javascript和JSON都支持
\uxxx
Unicode语法,因此您可以使用
JSON\u decode
处理人工创建的JSON字符串表示。为了澄清这一点,我改变了措辞。好的,我的问题的一个答案的严格表述是:$str=json_decode(“\u1000”);谢谢。我尝试了
echo json_解码('\u201B')
指的是a,但它不工作,这意味着没有输出(即使通过管道传输到
hd
),您需要
echo json_解码(“\u201B”)。unicode符号周围的双引号是必需的。是否有一些PHP常量可用来代替普通字符串
'HTML-ENTITIES'
'UTF-8'
?非常适合复制/粘贴项目符号字符(\xE2\x80\xA2)时可能导致源文档中的UTF-8编码错误。谢谢。可以这样使用:
wordwrap($longLongText,20,“\u{200B}”,true)(它是)我相信OP想要的是这个答案,而不是公认的答案。无论如何,当我搜索“PHP中的Unicode”时,是因为我想要这个答案,而不是公认的答案。当第一次问这个问题时,“\u{abcd}”可能不存在。如果是这样的话,现在应该移动被接受的答案。简单、优雅、直接和完全安全的方法+10
<?php
    header('content-type:text/html;charset=utf-16le');
    echo("\xA2\x30");
?>
<?php
    header('content-type:text/html;charset=utf-8');
    echo("\xE3\x82\xA2");
?>
$unicodeChar = "\u{1000}";
// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = "&#8202;";
$realChar = html_entity_decode($htmlEntityChar);
$phpChar = "\xE2\x80\x8A";
echo 'Proof: ';
var_dump($realChar === $phpChar); // bool(true)
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('&#8202;') . "\n";
// \xe2\x80\x8a

// Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
// \xe2\x80\x8a
function unicode_to_textstring($str){

    $rawstr = pack('H*', $str);

    $newstr =  iconv('UTF-16BE', 'UTF-8', $rawstr);
    return $newstr;
}