Преобразовать символы Юникода выше 127 в десятичные [дубликаты]

Возможный дубликат:
Как преобразовать текст в кодировку Unicode, например, с помощью php?

Я пытаюсь преобразовать все символы, которые не вписываются в 7-разрядный символ ANSI, в экранированную форму,\uN, гдеN это его десятичное значение. Вот что я придумала:

private static function escape($str) {
    return preg_replace_callback('~[\\x{007F}-\\x{FFFF}]~u',function($m){return '\\u'.ord($m[0]);},$str);
}

Я пробовал это с такими персонажами, как Гамма,

echo self::escape('Γ');

Но я получаю\u206 отступить вместо\u915, Я не могу понять, где я иду не так ... идеи?

На самом деле, похоже, что либоord() Функция не дает мне значение, или я хочу, или, возможно, кодировка в моем файле .php неверна?

 mpen11 окт. 2012 г., 22:45
@mario: я думаю, что мое решение выглядит как более чистая, более эффективная версия, найденная на этой странице :)
 mario11 окт. 2012 г., 22:50
Использовал что-то похожее:return preg_replace("/[^\\x{0020}-\\x{007F}]/ue", "'\\u'.current(unpack('H*', iconv('UTF-8', 'UCS-2BE', '$0')))", $var);
 mpen11 окт. 2012 г., 22:41
@DaveRandom: есть еще один в самом низу страницы 2004 года, который, кажется, работает.
 mpen11 окт. 2012 г., 22:37
Должен был прочитать первый комментарий наord страница;ca3.php.net/manual/en/function.ord.php
 DaveRandom11 окт. 2012 г., 22:39
Этоa способ сделать это, но это ужасный способ сделать это, всего минуту, пока я выкапываюправильно способ сделать это.

Ответы на вопрос(1)

Решение Вопроса

как именно работает UTF-8, но вотutf8_ord() функция и дополнениеutf8_chr(),chr() почти полностью дословно снят с моего ответаВот.

function utf8_ord ($chr)
{
    $bytes = array_values(unpack('C*', $chr));

    switch (count($bytes)) {
        case 1:
            return $bytes[0] < 0x80
                ? $bytes[0]
                : false;
        case 2:
            return ($bytes[0] & 0xE0) === 0xC0 && ($bytes[1] & 0xC0) === 0x80
                ? (($bytes[0] & 0x1F) << 6) | ($bytes[1] & 0x3F)
                : false;
        case 3:
            return ($bytes[0] & 0xF0) === 0xE0 && ($bytes[1] & 0xC0) === 0x80 && ($bytes[2] & 0xC0) === 0x80 
                ? (($bytes[0] & 0x0F) << 12) | (($bytes[1] & 0x3F) << 6) | ($bytes[2] & 0x3F)
                : false;
        case 4:
            return ($bytes[0] & 0xF8) === 0xF0 && ($bytes[1] & 0xC0) === 0x80 && ($bytes[2] & 0xC0) === 0x80 && ($bytes[3] & 0xC0) === 0x80
                ? (($bytes[0] & 0x07) << 18) | (($bytes[1] & 0x3F) << 12) | (($bytes[2] & 0x3F) << 6) | ($bytes[3] & 0x3F)
                : false;
    }

    return false;
}

function utf8_chr ($ord)
{
    switch (true) {
        case $ord < 0x80:
            return pack('C*', $ord & 0x7F);
        case $ord < 0x0800:
            return pack('C*', (($ord & 0x07C0) >> 6) | 0xC0, ($ord & 0x3F) | 0x80);
        case $ord < 0x010000:
            return pack('C*', (($ord & 0xF000) >> 12) | 0xE0, (($ord & 0x0FC0) >> 6) | 0x80, ($ord & 0x3F) | 0x80);
        case $ord < 0x110000:
            return pack('C*', (($ord & 0x1C0000) >> 18) | 0xF0, (($ord & 0x03F000) >> 12) | 0x80, (($ord & 0x0FC0) >> 6) | 0x80, ($ord & 0x3F) | 0x80);
    }

    return false;
}
 DaveRandom12 окт. 2012 г., 11:30
Проверка @Mark теперь добавлена вutf8_ord()
 DaveRandom12 окт. 2012 г., 10:06
@Mark, потому что вам нужно изучить каждый символ. Вам необходимо извлечь переменное число битов (5, 4 или 3) справа от первого байта и 6 конечных битов из каждого последующего байта. Намного проще иметь дело с этим 1 байтом за раз. Если я не пропустил что-то. Сказав это, я могу преобразовать это вN* (для этого нужно длинное значение, так как оно может составлять 4 байта), поскольку было бы легче проверить, что это действительно символ UTF-8.switch (TRUE) это как дерево elseif, где вы оцениваете каждое выражение как логическое, в данном конкретном случае я думаю, что оно более читабельно, YMMV.
 mpen12 окт. 2012 г., 03:09
Впервые я увиделswitch(true); аккуратный. Относительно вашегоutf8_ord зачем распаковывать в символы, если вы можете распаковать прямо в десятичную с помощьюn*?
 DaveRandom12 окт. 2012 г., 11:02
@Mark На самом деле,это Вот почему вы должны использовать символы, а не шорты. Потому что все, что не вписывается в определенную многобайтовую последовательность, игнорируетсяunpack()

Ваш ответ на вопрос