![]() |
|
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]()
|
|
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Подскажите, пожалуйста, как можно перевести двухбайтовый символ из одной кодировки в другую т.е. из utf-8 в cp1251 на php. Т.е. скажем я хочу преобразовать букву "г" из utf-8 в cp1251.
Насколько я понимаю, я получаю два символа [syntax=php]Р[/syntax] и [syntax=php]і[/syntax], т.е. два байта, а как мне теперь как мне их сложить, или перевести в десятичное представление, чтобы потом произвести какое-либо действие, например вычесть 848, чтобы получить тотже номер в системе cp1251 Интересует именно способ, а не готовые функции |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 8 Всего: 260 |
перевод из одной кодировки в другую простыми арифметическими операциями не возможен.
|
|||
|
||||
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Пускай не очень простыми. Может к примеру привести двухбайтовую кодировку в десятичное число, а потом уже в зависимости от порядкового номера символа перевести в тот же ascii.
Или еще какой способ |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 8 Всего: 260 |
смотри.
вне зависимости от "байтности" кодировки. это просто придуманная кем-то таблица, где каждому символу однозначно соответствует определенный код. да, есть некая закономерность: часть символов кодируется одинаково(один байт с одним и тем же значением — во имя совместимости) — но это справедливо не для всех кодировок и только для символов латиницы/цифр. да, зачастую диапазоны символов идут подряд(от А до Я), но это справделиво не для всех кодировок(в ср1251 ё стоит особняком, а в koi8-R вообще ужас что творится). Добавлено через 1 минуту и 13 секунд *начиная что-то подозревать* или тебе жестко из utf-8 в cp1251? тогда скажи, как быть с символами, не имеющими полноценных соответствий(ü, например)? |
|||
|
||||
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Да мне жестко из utf-8 в cp1251. Часть символов я могу обработать, те же А-Яа-я, т.к. они идут друг за другом, часть могу обработать отдельно, ненужные оставить, а нужные, которые не поддерживает ascii преобразовать в мнемоники. Т.е. по идее мне нужно получить десятичное представление utf-8 символов. Избежать попадания ненужных символов. Например в одном документе мне среди utf-8 символов мне попался символ из другой кодировке.
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 12 Всего: 386 |
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Все это здорого, но по такому запросу я получаю набор готовых функций и некоторые выражения мне честно говоря не очень понятны, например такое.
|
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 8 Всего: 260 |
||||
|
||||
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Вопрос первый Если $i стандарт ascii возвращаем его, не ясно только, почему он не двухбатовый, т.е. первый байт ведь тоже должен наверное быть в Utf-8, даже если он состоит только из одних нулей. И почему не может быть скажем тогда получиться скажем один символ с двумя байтами с числом меньшим или равно 127 т.е. 127.127 два байта одного символа utf-8, получается такое не возможно? Почему? Вопрос второй А вот здесь мне не ясно что происходит. Берем к примеру букву ы. Ее двоичтое представление смещаю на 5 вправо, или проще говоря, убираю пять символов с конца и как результат получается что если первый байт символов больше или равен 192, то, выполняем какие-либо действия дальше Соответственно, почему же это именно 192, и что возможно более важно, как получить десятичное представление utf-8, чтобы в дальшейшем перевести его в мнемоники Это сообщение отредактировал(а) platedz1 - 6.2.2013, 23:33 |
|||
|
||||
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Вроде все понял. Буду пробовать. Спасибо за ответы
|
|||
|
||||
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Все таки как-то не ясно мне
Вот двоичное представление буквы я 0000 0100 0100 1111 Получается первый байт 0000100 = 4 второй байт 01001111 = 79 но функция ord()
возвращает мне 209-143 Почему? Это сообщение отредактировал(а) platedz1 - 7.2.2013, 05:39 |
|||
|
||||
| Arantir |
|
|||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 1 Всего: 55 |
Потому, что написанное вами до и после фразы "но функция" никак между собой не связано.
Такого понятия как "двоичное представление буквы" в природе не существует. Есть коды символов в кодировках. И 10001001111, что есть 1103 - это код символа "я" в кодировке UTF-8 (а так же UTF-16 и UTF-32). А вы пробуете его с помощью особой уличной магии ($rssstring[0] и $rssstring[1]) получить какие-то циферки из функции, которая "Возвращает ASCII-код первого символа строки" http://www.php.net/manual/ru/function.ord.php И возвращает на все совершенно правильно. Потому, что символ "я" занимает в UTF два байта, а кодировка ASCII является однобайтной. И в ASCII символ, который соответствует первому байту имеет номер 209, а второй символ - номер 143. По-этому нет ничего удивительного в том, что при кодировке UTF-8 вот этот код:
-------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Так я ж и спрашиваю, не почему 0000 0100 0100 1111 или 209 и 143 - это буква я
А почему 0000 0100 0100 1111 - это 209(первый байт), а 143(второй байт) Это сообщение отредактировал(а) platedz1 - 7.2.2013, 11:25 |
|||
|
||||
| Arantir |
|
|||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 1 Всего: 55 |
Я ведь уже сказал — потому, что вы разные кодировки в одну тарелку пытаетесь засунуть
209 — это номер того символа в ascii, который имеет номер 0000 0100 в utf. Это два номера одного символа, но в разных кодировках. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
| platedz1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 12.1.2013 Репутация: нет Всего: нет |
Я понимаю, что они разные, но мне их как-то обработать нужно.
В принципе вроде разобрался благодаря таблице http://ru.wikipedia.org/wiki/UTF-8 Т.е. я так понял, чтобы перевести в десятичное представление того же utf-8 нужно определить сначала сколько бит используется, если первый 1 то значит больше одного а там дальше уже по таблице. Единственное, что хотелось бы найти где-то уже готовый набор utf-8 символов, чтобы загрузить их уже и проверить работу скрипта. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Тексты | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |