是否有一个函数将UTF-8更改为Unicode,将非特殊字符保留为普通字母和数字?
即德语单词"tchüß"将呈现为"tch\20AC\21AC"(请注意我正在制作Unicode代码).
编辑:我正在尝试以下函数,但虽然这一个适用于ASCII 32-127,它似乎失败的双字节字符:
function strToHex ($string)
{
$hex = '';
for ($i = 0; $i < mb_strlen ($string, "utf-8"); $i++)
{
$id = ord (mb_substr ($string, $i, 1, "utf-8"));
$hex .= ($id <= 128) ? mb_substr ($string, $i, 1, "utf-8") : "&#" . $id . ";";
}
return ($hex);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑2:找到解决方案:PHP ord()函数不适用于双字节字符.请改用:http://nl.php.net/manual/en/function.ord.php#78032
bob*_*nce 27
对于可读形式,我会使用JSON.在JSON中不需要转义非ASCII字符,但PHP会:
echo json_encode("tchüß");
"tch\u00fc\u00df"
Run Code Online (Sandbox Code Playgroud)
小智 10
对于希望为任何字符找到Unicode代码点的人来说,这可能很有用.然后,您可以按照您想要的任何方式对字符串进行编码,使用转义码替换某些字符,并将其他字符保留为二进制形式(例如ascii可打印字符),具体取决于您要使用它的上下文.
From:将代码点映射到Unicode编码表单
UTF-32的映射本质上是标识映射:用于编码代码点的32位代码单元具有与代码点本身相同的整数值.
/**
* Convert a string into an array of decimal Unicode code points.
*
* @param $string [string] The string to convert to codepoints
* @param $encoding [string] The encoding of $string
*
* @return [array] Array of decimal codepoints for every character of $string
*/
function toCodePoint( $string, $encoding )
{
$utf32 = mb_convert_encoding( $string, 'UTF-32', $encoding );
$length = mb_strlen( $utf32, 'UTF-32' );
$result = [];
for( $i = 0; $i < $length; ++$i )
$result[] = hexdec( bin2hex( mb_substr( $utf32, $i, 1, 'UTF-32' ) ) );
return $result;
}
Run Code Online (Sandbox Code Playgroud)
使用PHP 7,有一个新的IntlChar :: ord()从给定的UTF-8字符中查找Unicode代码点:
var_dump(sprintf('U+%04X', IntlChar::ord('ß')));
# Outputs: string(6) "U+00DF"
Run Code Online (Sandbox Code Playgroud)
可以使用 iconv 将一种字符集转换为另一种字符集:
http://php.net/manual/en/function.iconv.php
请注意,UTF 已经是 Unicode 编码。
另一种方法是简单地使用具有正确字符集的 htmlentities:
http://php.net/manual/en/function.htmlentities.php