UTF-8 для кодовых точек Юникода

Есть ли функция, которая изменит UTF-8 на Unicode, оставив неспециальные символы в виде обычных букв и цифр?

т.е. немецкое слово «tchüß» будет отображаться как «tch \ 20AC \ 21AC» (обратите внимание, что я делаю коды Юникода).

EDIT: Я экспериментирую со следующей функцией, но, хотя она хорошо работает с 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); } 

Есть идеи?

EDIT 2: Найденное решение: функция PHP ord () не работает для двухбайтовых символов. Вместо этого используйте: http://nl.php.net/manual/en/function.ord.php#78032

Преобразование одного набора символов в другое может быть выполнено с помощью iconv:

http://php.net/manual/en/function.iconv.php

Обратите внимание, что UTF уже является кодировкой Unicode.

Другой способ – просто использовать htmlentities с правильным набором символов:

http://php.net/manual/en/function.htmlentities.php

Для читаемой формы я бы пошел с JSON. В JSON не требуется избегать символов, отличных от ASCII, но PHP:

 echo json_encode("tchüß"); "tch\u00fc\u00df" 

Для людей, желающих найти Кодовую точку Юникода для любого персонажа, это может быть полезно. Затем вы можете кодировать строку в любом месте, заменяя определенные символы escape-кодами и оставляя других в своей двоичной форме (например, 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; } 

Думаю, вы собираетесь распечатать свои строки на веб-сайте?

Я храню все свои базы данных в uft8, используя html_entities ($ string) перед выходом.

Возможно, вам нужно попробовать html_entities (utf8_encode ($ string));

Я однажды создал функцию с именем _convert (), которая безопасно кодирует все в UTF-8.

С PHP 7 существует новый IntlChar :: ord (), чтобы найти Кодовую точку Юникода от заданного символа UTF-8:

 var_dump(sprintf('U+%04X', IntlChar::ord('ß'))); # Outputs: string(6) "U+00DF" 

У меня возникла проблема, когда мне нужно преобразовать строку (utf-8 по умолчанию) с кириллицей, а частично – только кириллицей. Наконец, мне нужно получить JSON-подобный результат, например:

 <li class="my_class">City - Mocsow (Москва)</li> 

к этому:

 <li class=\"my_class\">City - Mocsow (\u041c\u043e\u0441\u043a\u0432\u0430)<\/li> 

Итак, у меня есть compex (сочетание решения subj. author и 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 🙂

Протестировано по 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