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

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

07.05.2013, 00:10. Показов 15218. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер