Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертирование двухбайтовых символов. 
:(
    Опции темы
platedz1
Дата 6.2.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Подскажите, пожалуйста, как можно перевести двухбайтовый символ из одной кодировки в другую т.е. из utf-8 в cp1251 на php. Т.е. скажем я хочу преобразовать букву "г" из utf-8 в cp1251.
Насколько я понимаю, я получаю два символа [syntax=php]Р[/syntax] и [syntax=php]і[/syntax], т.е. два байта, а как мне теперь как мне их сложить, или перевести в десятичное представление, чтобы потом произвести какое-либо действие, например вычесть 848, чтобы получить тотже номер в системе cp1251

Интересует именно способ, а не готовые функции
PM MAIL WWW   Вверх
skyboy
Дата 6.2.2013, 16:37 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



перевод из одной кодировки в другую простыми арифметическими операциями не возможен.

PM MAIL   Вверх
platedz1
Дата 6.2.2013, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Пускай не очень простыми. Может к примеру привести двухбайтовую кодировку в десятичное число, а потом уже в зависимости от порядкового номера символа перевести в тот же ascii. 
Или еще какой способ
PM MAIL WWW   Вверх
skyboy
Дата 6.2.2013, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



смотри.
вне зависимости от "байтности" кодировки.
это просто придуманная кем-то таблица, где каждому символу однозначно соответствует определенный код. 
да, есть некая закономерность: часть символов кодируется одинаково(один байт с одним и тем же значением — во имя совместимости) — но это справедливо не для всех кодировок и только для символов латиницы/цифр.
да, зачастую диапазоны символов идут подряд(от А до Я), но это справделиво не для всех кодировок(в ср1251 ё стоит особняком, а в koi8-R вообще ужас что творится).

Добавлено через 1 минуту и 13 секунд
*начиная что-то подозревать*
или тебе жестко из utf-8 в cp1251?
тогда скажи, как быть с символами, не имеющими полноценных соответствий(ü, например)?
PM MAIL   Вверх
platedz1
Дата 6.2.2013, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Да мне жестко из utf-8 в cp1251. Часть символов я могу обработать, те же А-Яа-я, т.к. они идут друг за другом, часть могу обработать отдельно, ненужные оставить, а нужные, которые не поддерживает ascii преобразовать в мнемоники. Т.е. по идее мне нужно получить десятичное представление utf-8 символов. Избежать попадания ненужных символов. Например в одном документе мне среди utf-8 символов мне попался символ из другой кодировке. 
PM MAIL WWW   Вверх
ksnk
Дата 6.2.2013, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
platedz1
Дата 6.2.2013, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Все это здорого, но по такому запросу я получаю набор готовых функций и некоторые выражения мне честно говоря не очень понятны, например такое. 

Код

 $new_c1=($c1>>2)&5;

PM MAIL WWW   Вверх
skyboy
Дата 6.2.2013, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



PM MAIL   Вверх
platedz1
Дата 6.2.2013, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Код

$s= "йцукенгшщзхъэждлорпавыфячсмитьбю.";

           for ($c=0;$c<strlen($s);$c++)
           {
           
              $i=ord($s[$c]);
              
              if ($i<=127) $out.=$s[$c]; // вопрос первый
                  if ($byte2){ //здесь я так понимаю уже нужно работать с двумя байтами. ????
                      $new_c2=($c1&3)*64+($i&63);
                      $new_c1=($c1>>2)&5;
                      $new_i=$new_c1*256+$new_c2;
                  if ($new_i==1025){
                      $out_i=168;
                  } else {
                      if ($new_i==1105){
                          $out_i=184;
                      } else {
                          $out_i=$new_i-848;
                      }
                  }
                  $out.=chr($out_i);
                  $byte2=false;
                  } 
              if (($i>>5) == 6) { //вопрос второй
                 echo $c1=$i; //здесь определяем, первый байт 
                 echo "<br>";
                  $byte2=true; ///здесь определяем, что при следующей итерации к $cl=$i будет добавлен еще один байт
              }
           }
           echo $out;





Вопрос первый
Если $i стандарт ascii возвращаем его, не ясно только, почему он не двухбатовый, т.е. первый байт ведь тоже должен наверное быть в Utf-8, даже если он состоит только из одних нулей. И почему не может быть скажем тогда получиться скажем один символ с двумя байтами с числом меньшим или равно 127 т.е. 127.127 два байта одного символа utf-8, получается такое не возможно? Почему?

Вопрос второй
А вот здесь мне не ясно что происходит. Берем к примеру букву ы. Ее двоичтое представление смещаю на 5 вправо, или проще говоря, убираю пять символов с конца и как результат получается что если первый байт символов больше или равен 192,  то, выполняем какие-либо действия дальше Соответственно, почему же это именно 192,  и что возможно более важно, как получить десятичное представление utf-8, чтобы в дальшейшем перевести его в мнемоники

Это сообщение отредактировал(а) platedz1 - 6.2.2013, 23:33
PM MAIL WWW   Вверх
platedz1
Дата 7.2.2013, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Вроде все понял. Буду пробовать. Спасибо за ответы
PM MAIL WWW   Вверх
platedz1
Дата 7.2.2013, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



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

Код

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


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

209-143

Почему?


Это сообщение отредактировал(а) platedz1 - 7.2.2013, 05:39
PM MAIL WWW   Вверх
Arantir
Дата 7.2.2013, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 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 вот этот код:
Код

echo chr(209), chr(143);
покажет в браузере прописную букву "я". Так как для браузера два этих байта вместе при кодировке UTF-8 означают, что он должен показать эту букву.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
platedz1
Дата 7.2.2013, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Так я ж и спрашиваю, не почему 0000 0100 0100 1111 или 209 и 143 - это буква я

А почему 
0000 0100 0100 1111 - это 209(первый байт), а 143(второй байт)

Это сообщение отредактировал(а) platedz1 - 7.2.2013, 11:25
PM MAIL WWW   Вверх
Arantir
Дата 7.2.2013, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 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
}
PM   Вверх
platedz1
Дата 7.2.2013, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.1.2013

Репутация: нет
Всего: нет



Я понимаю, что они разные, но мне их как-то обработать нужно. 
В принципе вроде разобрался благодаря таблице http://ru.wikipedia.org/wiki/UTF-8
Т.е. я так понял, чтобы перевести в десятичное представление того же utf-8 нужно определить сначала сколько бит используется, если первый 1 то значит больше одного а там дальше уже по таблице. 
Единственное, что хотелось бы найти где-то уже готовый набор utf-8 символов, чтобы загрузить их уже и проверить работу скрипта.

PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.