Как преобразовать кодовые точки Unicode в шестнадцатеричные объекты HTML? - PullRequest
3 голосов
/ 13 августа 2010

У меня есть файл данных (точнее, Apple plist), который имеет Unicode кодовые точки , такие как \U00e8 и \U2019. Мне нужно превратить их в действительные шестнадцатеричные сущности HTML с использованием PHP.

То, что я сейчас делаю, это длинная строка:

 $fileContents = str_replace("\U00e8", "è", $fileContents);
 $fileContents = str_replace("\U2019", "’", $fileContents);

Что явно ужасно. Я мог бы использовать регулярное выражение для преобразования \U и всех конечных 0s в &#x, а затем использовать конечный ;, но это также кажется неуклюжим.

Существует ли простой и понятный способ взять строку и заменить все кодовые точки Юникода на объекты HTML?

Ответы [ 2 ]

7 голосов
/ 24 августа 2010

Вот правильный ответ, который касается того факта, что это кодовые единицы, а не кодовые точки, и позволяет декодировать дополнительные символы.

function unenc_utf16_code_units($string) {
    /* go for possible surrogate pairs first */
    $string = preg_replace_callback(
        '/\\\\U(D[89ab][0-9a-f]{2})\\\\U(D[c-f][0-9a-f]{2})/i',
        function ($matches) {
            $hi_surr = hexdec($matches[1]);
            $lo_surr = hexdec($matches[2]);
            $scalar = (0x10000 + (($hi_surr & 0x3FF) << 10) |
                ($lo_surr & 0x3FF));
            return "&#x" . dechex($scalar) . ";";
        }, $string);
    /* now the rest */
    $string = preg_replace_callback('/\\\\U([0-9a-f]{4})/i',
        function ($matches) {
            //just to remove leading zeros
            return "&#x" . dechex(hexdec($matches[1])) . ";";
        }, $string);
    return $string;
}
4 голосов
/ 13 августа 2010

Вы можете использовать preg_replace:

preg_replace('/\\\\U0*([0-9a-fA-F]{1,5})/', '&#x\1;', $fileContents);

Тестирование RE:

PS> 'some \U00e8 string with \U2019 embedded Unicode' -replace '\\U0*([0-9a-f]{1,5})','&#x$1;'
some &#xe8; string with &#x2019; embedded Unicode
...