Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/78: Рейтинг темы: голосов - 78, средняя оценка - 4.92
5 / 5 / 1
Регистрация: 14.10.2012
Сообщений: 75

Как получить код символа в кодировке UTF-8?

07.05.2013, 00:10. Показов 15261. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется WP. В нем посты в кодировке UTF-8.
Как получить код символа в кодировке UTF-8?
Вообще задача большая и мне придутся очень много работать со строками и символами. А наш "любимый" PHP до сих пор не дружит с UTF-8. Если у кого то есть советы по тому как их друг с другом примерить, буду благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2013, 00:10
Ответы с готовыми решениями:

Как можно получить код символа в какой-либо кодировке?
Как можно получить код символа в какой-либо кодировке? И какую тогда лучше использовать кодировку, если необходимо использовать латиницу,...

Код не выводит символы в кодировке UTF-8, которые представляют из себя суррогатные пары юникода
Друзья! Продолжаем разбираться с юникодом .Вот код. Он должен выводить таблицу юникода, точнее первые 65535 символов. #!/usr/bin/env...

Как хранить строки в кодировке UTF-8?
Как сделать, чтобы в строковом типе символы находились в кодировке utf8? в данном коде слово ТЕКСТ будет в 1251. string строка =...

6
9 / 9 / 1
Регистрация: 02.09.2011
Сообщений: 70
07.05.2013, 11:14
ord
0
5 / 5 / 1
Регистрация: 14.10.2012
Сообщений: 75
07.05.2013, 11:19  [ТС]
Спасибо конечно)), но ord определяет код символа в ASCII кодировке (это когда на кодирование символа используется 1 байт). В юнекод другая система.
0
9 / 9 / 1
Регистрация: 02.09.2011
Сообщений: 70
07.05.2013, 11:22
Ну а конвертация из одной кодировки в другую тоже не поможет:?
0
5 / 5 / 1
Регистрация: 14.10.2012
Сообщений: 75
07.05.2013, 11:26  [ТС]
Нет)...во первых объемы текста довольно большие (несколько миллионов символов) и конвертировать их постоянно это накладно. И во что, например, конвертировать (в ASCII не кириллицы)?)
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.05.2013, 17:43
Две взаимнообратные функции:
PHP Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
 * Преобразование кода символа Юникода в символ в UTF-8
 *
 * @param int $code
 * Код символа из диапазона Юникода.
 *
 * @return string
 * Символ с соответствующим кодом в кодировке UTF-8.
 *
 * @throws RangeException
 */
function codeToUtf8($code) {
    $code = (int) $code;
 
    if ($code < 0) {
        throw new RangeException("Negative value was passed");
    }
    # 0-------
    elseif ($code <= 0x7F) {
        return chr($code);
    }
    # 110----- 10------
    elseif ($code <= 0x7FF) {
        return chr($code >> 6 | 0xC0)
            . chr($code & 0x3F | 0x80)
        ;
    }
    # 1110---- 10------ 10------
    elseif ($code <= 0xFFFF) {
        return chr($code >> 12 | 0xE0)
            . chr($code >> 6 & 0x3F | 0x80)
            . chr($code & 0x3F | 0x80)
        ;
    }
    # 11110--- 10------ 10------ 10------
    elseif ($code <= 0x1FFFFF) {
        return chr($code >> 18 | 0xF0)
            . chr($code >> 12 & 0x3F | 0x80)
            . chr($code >> 6 & 0x3F | 0x80)
            . chr($code & 0x3F | 0x80)
        ;
    }
    # 111110-- 10------ 10------ 10------ 10------
    elseif ($code <= 0x3FFFFFF) {
        return chr($code >> 24 | 0xF8)
            . chr($code >> 18 & 0x3F | 0x80)
            . chr($code >> 12 & 0x3F | 0x80)
            . chr($code >> 6 & 0x3F | 0x80)
            . chr($code & 0x3F | 0x80)
        ;
    }
    # 1111110- 10------ 10------ 10------ 10------ 10------
    elseif ($code <= 0x7FFFFFFF) {
        return chr($code >> 30 | 0xFC)
            . chr($code >> 24 & 0x3F | 0x80)
            . chr($code >> 18 & 0x3F | 0x80)
            . chr($code >> 12 & 0x3F | 0x80)
            . chr($code >> 6 & 0x3F | 0x80)
            . chr($code & 0x3F | 0x80)
        ;
    }
    else {
        throw new RangeException("Invalid character code");
    }
}
 
/**
 * Получение кода символа Юникода
 *
 * @param string $utf8Char
 * Символ в кодировке UTF-8. Если в строке содержится больше одного символа
 * UTF-8, то учитывается только первый.
 *
 * @return int
 * Код символа из Юникода.
 *
 * @throws InvalidArgumentException
 */
function utf8ToCode($utf8Char) {
    $utf8Char = (string) $utf8Char;
 
    if ("" == $utf8Char) {
        throw new InvalidArgumentException("Empty string is not valid character");
    }
 
    # [a, b, c, d, e, f]
    $bytes = array_map('ord', str_split(substr($utf8Char, 0, 6), 1));
 
    # a, [b, c, d, e, f]
    $first = array_shift($bytes);
 
    # 0-------
    if ($first <= 0x7F) {
        return $first;
    }
    # 110----- 10------
    elseif ($first >= 0xC0 && $first <= 0xDF) {
        $tail = 1;
    }
    # 1110---- 10------ 10------
    elseif ($first >= 0xE0 && $first <= 0xEF) {
        $tail = 2;
    }
    # 11110--- 10------ 10------ 10------
    elseif ($first >= 0xF0 && $first <= 0xF7) {
        $tail = 3;
    }
    # 111110-- 10------ 10------ 10------ 10------
    elseif ($first >= 0xF8 && $first <= 0xFB) {
        $tail = 4;
    }
    # 1111110- 10------ 10------ 10------ 10------ 10------
    elseif ($first >= 0xFC && $first <= 0xFD) {
        $tail = 5;
    }
    else {
        throw new InvalidArgumentException("First byte is not valid");
    }
 
    if (count($bytes) < $tail) {
        throw new InvalidArgumentException("Corrupted character: $tail tail bytes required");
    }
 
    $code = ($first & (0x3F >> $tail)) << ($tail * 6);
 
    $tails = array_slice($bytes, 0, $tail);
    foreach ($tails as $i => $byte) {
        $code |= ($byte & 0x3F) << (($tail - 1 - $i) * 6);
    }
 
    return $code;
}
Тест:
PHP Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
foreach (
    array(0x21, 0x0410, 0x044B, 0x2116)
    as $code
) {
    $char = codeToUtf8($code);
    $back_code = utf8ToCode($char);
 
    printf(
        "%04x -> %s -> %04x (%s)"
        , $code
        , $char
        , $back_code
        , ($code === $back_code)
            ? "+ok"
            : "!fail"
    );
    echo PHP_EOL;
}
Результат:
Code Скопировано
1
2
3
4
0021 -> ! -> 0021 (+ok)
0410 -> А -> 0410 (+ok)
044b -> ы -> 044b (+ok)
2116 -> № -> 2116 (+ok)
См. http://ru.wikipedia.org/wiki/UTF-8
1
5 / 5 / 1
Регистрация: 14.10.2012
Сообщений: 75
07.05.2013, 18:06  [ТС]
О ла ла! Сам понимал что все не так просто как кажется, но не на столько=). Большое спасибо, буду разбираться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2013, 18:06
Помогаю со студенческими работами здесь

Как сделать сайт в кодировке UTF-8?
Если я правильно понимаю, то для изготовления страницы в кодировке UTF-8 надо не только прописать эту кодировку в charset, но и сам файл...

Как записать файл в кодировке utf-8?
Вообщет задача такая, нужно файл записать в кодировке utf-8 или unicode и нужно чтобы русские символы считывались. Я хочу добиться чтобы...

Как сохранить текст из memo в кодировке UTF-8?
Приветствую! Нужна Ваша помощь. Мне надо сохранить текст из memo1 в кодировке UTF-8. Процедура сохранения вот(работает, но кодировка...

Как записать в файл строку в кодировке UTF-8?
Здравствуйте уважаемые пользователи, модераторы и все обитатели этого форума! Нужна снова ваша помощь! Ниже представлен скрипт который...

Как правильно вывести файл в кодировке UTF-16LE?
Друзья! НА самом-то деле я всё правильно делаю. Вот код: import codecs f = codecs.open (&quot;foo.txt&quot;, 'r', &quot;UTF-16LE&quot;) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров.
Programma_Boinc 21.04.2025
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров. 3 марта 2025 года, в результате обобщенного поиска простых чисел Ферма в PrimeGrid был найден. . .
Система статов в Unity
GameUnited 20.04.2025
Статы — фундаментальный элемент игрового дизайна, который определяет характеристики персонажей, предметов и других объектов в игровом мире. Будь то показатель силы в RPG, скорость передвижения в. . .
Статические свойства и методы в TypeScript
run.dev 20.04.2025
TypeScript прочно занял своё место в системе современной веб-разработки. Этот строго типизированный язык программирования не просто расширяет возможности JavaScript — он делает разработку более. . .
Batch Transform и Batch Gizmo Drawing API в Unity
GameUnited 20.04.2025
В мире разработки игр и приложений на Unity производительность всегда была критическим фактором успеха. Создатели игр постоянно балансируют между визуальной привлекательностью и плавностью работы. . .
Звук в Unity: Рандомизация с Audio Random Container
GameUnited 20.04.2025
В современных играх звуковое оформление часто становится элементом, который либо полностью погружает игрока в виртуальный мир, либо разрушает атмосферу за считанные минуты. Представьте: вы исследуете. . .
Максимальная производительность C#: Советы, тестирование и заключение
stackOverflow 20.04.2025
Погружение в мир микрооптимизаций C# открывает перед разработчиком целый арсенал мощных техник. Но как определить, где и когда их применять? Ответ начинается с точных измерений и профилирования. . . .
Максимальная производительность C#: Предсказание ветвлений
stackOverflow 20.04.2025
Третий ключевой аспект низкоуровневой оптимизации — предсказание ветвлений. Эта тема менее известна среди разработчиков, но её влияние на производительность может быть колоссальным. Чтобы понять. . .
Максимальная производительность C#: Векторизация (SIMD)
stackOverflow 20.04.2025
Помимо работы с кэшем, другим ключевым аспектом низкоуровневой оптимизации является векторизация вычислений. SIMD (Single Instruction, Multiple Data) позволяет обрабатывать несколько элементов данных. . .
Максимальная производительность C#: Процессорный кэш
stackOverflow 20.04.2025
Знакомство с внутренним устройством процессорного кэша — ключевой шаг в написании по-настоящему быстрого кода на C#. Этот слой архитектуры компьютера часто ускользает от внимания разработчиков, но. . .
Максимальная производительность C#: Введение в микрооптимизации
stackOverflow 20.04.2025
В мире разработки на C# многие привыкли полагаться на . NET Runtime, который "магическим образом" сам оптимизирует код. И часто это работает - современные JIT-компиляторы творят чудеса. Но когда речь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер