UTF-8 в кодовые точки Unicode - PullRequest
6 голосов
/ 18 августа 2011

Есть ли функция, которая изменит 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

Ответы [ 8 ]

26 голосов
/ 18 августа 2011

Для читаемой формы я бы пошел с JSON.Не требуется экранировать не-ASCII-символы в JSON, но PHP делает:

echo json_encode("tchüß");

"tch\u00fc\u00df"
9 голосов
/ 09 октября 2015

Для людей, которые хотят найти кодовую точку Unicode для любого символа, это может быть полезно. Затем вы можете закодировать строку как угодно, заменив определенные символы управляющими кодами и оставив другие в их двоичной форме (например, печатные символы ascii), в зависимости от контекста, в котором вы хотите использовать его.

С: Отображение кодовых точек в формы кодирования 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;
}
5 голосов
/ 05 февраля 2016

В PHP 7 существует новый IntlChar :: ord () для поиска кодовой точки Unicode из заданного символа UTF-8:

var_dump(sprintf('U+%04X', IntlChar::ord('ß')));

# Outputs: string(6) "U+00DF"
2 голосов
/ 18 августа 2011

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

2 голосов
/ 18 августа 2011

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

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

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

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

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

2 голосов
/ 18 августа 2011

Я предполагаю, что вы собираетесь распечатывать свои строки на веб-сайте?

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

Может бытьвам нужно попробовать html_entities (utf8_encode ($ string));

0 голосов
/ 11 июля 2017

Проверено на 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
0 голосов
/ 17 ноября 2015

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

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

к этому:

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

Итак, я получил комплексное решение (смесь подчиненного автора и 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:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...