webew
Войти » Регистрация
 
PHP

Конвертирование двухбайтовых символов.

6 февраля 2013, 13:27
Автор: platedz
Подскажите, пожалуйста, как можно перевести двухбайтовый символ из одной кодировки в другую т.е. из utf-8 в cp1251 на php. Т.е. скажем я хочу преобразовать букву "г" из utf-8 в cp1251.
Насколько я понимаю, я получаю два символа
Р
и
і
, т.е. два байта, а как мне теперь как мне их сложить, или перевести в десятичное представление, чтобы потом произвести какое-либо действие, например вычесть 848, чтобы получить тотже номер в системе cp1251

Интересует именно способ, а не готовые функции
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

platedz

Все таки как-то не ясно мне
Вот двоичное представление буквы я
0000 0100 0100 1111
Получается первый байт 0000100 = 4
второй байт 01001111 = 79
но функция ord()

echo ord($rssstring[0])."-".ord($rssstring[1])."<br>";


возвращает мне

209-143

Почему?
07.02.2013, 03:02
Ответить
NO USERPIC

rgbeast

См. рисунок и таблицу http://ru.wikipedia.org/wiki/UTF-8
Базовый код 044F по этим правилам превращается в другое двухбайтовое число
07.02.2013, 03:40
Ответить
NO USERPIC

platedz

Большое спасибо, теперь вроде все понятно. Т.е. они как бы делятся не на 8 бит, а на 6 бит. Не понятно, только куда деваются еще 2 бита. Т.е. они как бы пустые в utf-8?
07.02.2013, 10:24
Ответить
NO USERPIC

rgbeast

http://upload.wikimedia.org/wikipedia/commons/3/38/UTF-8_Encoding_Scheme.png
См. второй сверху рисунок В этом случае в исходном юникоде только 10 значимых битов. Затем они переставляются местами и добавляется еще 6 бит 1 или 0 в соответствии с рисунком. Получается 16-битный итоговый юникод
07.02.2013, 14:22
Ответить
NO USERPIC

platedz

Подскажите, правильно ли я понимаю.
Первое.
Т.е. если я правильно понимаю, то уникод и utf-8 - Это две разные кодировке, которые очень похожи и отличаются лишь по большому счету количеством байт т.е юникод 4 байта, а utf-8 (6 байт)?

Второе.
Получается было занято 7 бит (127 в десятичном), добавился еще один бит, и дальше уже первые два бита во втором байте особой роли не играют, они всегда 10(за исключением первого байта), а меняются лишь последние

Третье.
Соответственно, чтобы определить сколько байт занимает тот или иной символ, нужно определить первый бит. Если он равен единице, то значит используется больше одного бита. Соответственно если 110, значит 2 бита, 1110 - 3 бита, 11110 - 4 бита, и дальше уже не важно, т.к. Юникод заканчивается, а в utf-8 эти биты пустые. Так, определив сколько бит используется, уже можно по таблице или закономерности из нее исходящей, определить какой используется символ в юникоде и определить его номер.

Поправьте если я где-то ошибся, или не прав. А даже если прав, буду крайне признателен также узнать об этом, для уверенности, так сказать.
07.02.2013, 17:40
Ответить
NO USERPIC

rgbeast

похоже на правду, в вашем тексте только "3 бита" вместо "3 байта"
07.02.2013, 18:14
Ответить
NO USERPIC

platedz

Большое спасибо за ответы и за подсказки.

Вот получил я два байта скажем 16 (5 последних бит в первом байте) и 29 (6 последних бит во втором байте). А как мне их теперь сложить, чтобы число юникода получить?
07.02.2013, 20:27
Ответить
NO USERPIC

platedz

В целом большое спасибо, вроде разобрался. Сложение сделал сместив первые биты влево, а потом уже просто сплюсовал
07.02.2013, 23:49
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: