是否有将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);
}
有什么想法吗?
编辑2:找到解决方案:PHP ord()函数不适用于双字节字符。请改为使用:http://nl.php.net/manual/en/function.ord.php#78032
答案 0 :(得分:25)
对于可读形式,我会使用JSON。在JSON中不需要转义非ASCII字符,但PHP确实:
echo json_encode("tchüß");
"tch\u00fc\u00df"
答案 1 :(得分:9)
对于希望为任何角色找到Unicode代码点的人来说,这可能很有用。然后,您可以按照您想要的任何方式对字符串进行编码,使用转义码替换某些字符,并将其他字符保留为二进制形式(例如ascii可打印字符),具体取决于您要使用它的上下文。
来自:Mapping codepoints to Unicode encoding forms
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;
}
答案 2 :(得分:4)
使用PHP 7,有一个新的IntlChar::ord()可以从给定的UTF-8字符中找到Unicode代码点:
var_dump(sprintf('U+%04X', IntlChar::ord('ß')));
# Outputs: string(6) "U+00DF"
答案 3 :(得分:2)
我猜你打算在网站上打印出你的字符串?
我将所有数据库存储在uft8中,在输出之前使用html_entities($ string)。
也许你必须尝试 html_entities(函数utf8_encode($字符串));
答案 4 :(得分:2)
将一个字符集转换为另一个字符集可以使用iconv:
完成http://php.net/manual/en/function.iconv.php
请注意,UTF已经是Unicode编码。
另一种方法是简单地使用具有正确字符集的htmlentities:
答案 5 :(得分:2)
我曾经创建了一个名为_convert()的函数,它可以安全地将所有内容编码为UTF-8。
答案 6 :(得分:0)
当我需要将字符串(默认为utf-8)与cyrilic转换为部分实体时,我遇到了一个问题 - 只有cyrilic。 最后我需要获得类似JSON的结果,如下所示:
<li class="my_class">City - Mocsow (Москва)</li>
到此:
<li class=\"my_class\">City - Mocsow (\u041c\u043e\u0441\u043a\u0432\u0430)<\/li>
所以,我有一个compex(主题作者和Nus的混合)解决方案:
function strToHex($string){
$enc="utf-8";
$hex = '';
for ($i = 0; $i < mb_strlen ($string, $enc); $i++){
$id = ord (mb_substr ($string, $i, 1, $enc));
$hex .= ($id <= 128) ? mb_substr ($string, $i, 1, $enc) : toCodePoint(mb_substr ($string, $i, 1, $enc), $enc);
}
return $hex;
}
function toCodePoint($string, $encoding){
$utf32 = mb_convert_encoding( $string, 'UTF-32', $encoding );
$length = mb_strlen( $utf32, 'UTF-32' );
$result = Array();
for( $i = 0; $i < $length; ++$i )$result[] = "\u".substr(bin2hex( mb_substr( $utf32, $i, 1, 'UTF-32' ) ), 4,8);
return implode("", $result);
}
$output=strToHex(
str_replace( // this is for json compatible
array("\"", "\n", "\r", "\t", "/"),
array('\"', '\n', "", " ", "\/"),
$text
)
);
echo $output;
它在php 5.2.17上测试过:)
答案 7 :(得分:0)
在php 5.6上测试
/**
* @param string $utf8char
* @return string
*/
function toUnicodeCodePoint($utf8char)
{
return 'U+' . dechex(mb_ord($utf8char));
}
/**
* @see https://github.com/symfony/polyfill-mbstring
* @param string $s
* @return int
*/
function mb_ord($s)
{
$code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
if (0xF0 <= $code) {
return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
}
if (0xE0 <= $code) {
return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
}
if (0xC0 <= $code) {
return (($code - 0xC0) << 6) + $s[2] - 0x80;
}
return $code;
}
echo toUnicodeCodePoint('');
// U+1f613