Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2010, 12:08   #1
alex-chz
Пользователь
 
Аватар для alex-chz
 
Регистрация: 03.03.2010
Сообщений: 10
Восклицание UTF-8. ORD()не работает

Помогите разобраться с кодировками - уже второй день сижу и ничего вразумительного не смогу сообразить, как мне получить второй байт UTF? первый получается с ORD, а как "вымутить" второй?

Как мне получить код символов в кодировке UTF?
вот результат этого кода меня просто поставил в тупик...

PHP код:
for ($i=0;$i<255;$i++)
{
    
$a=ord(iconv("""utf-8"chr($i)));
    echo 
"".iconv("""utf-8"chr($i))."->".ord(iconv("""utf-8"chr($i)))."->".iconv("""utf-8"chr($a))."<br>";

Результат выполнения кода вот:
...................
v->118->v
w->119->w
x->120->x
y->121->y
z->122->z
{->123->{
|->124->|
}->125->}
~->126->~
->127->
Ђ->208->Р
Ѓ->208->Р
‚->226->в
ѓ->209->С
„->226->в
…->226->в
†->226->в
‡->226->в
€->226->в
‰->226->в
Љ->208->Р
................

Как видите, начиная со 127 символа все "посыпалось" и соответствие уже нарушилось. Как я со всего этого понял, в UTF русского используется несколько номеров. ну например букве "В"(код226) соответствует несколько символов, значит не хватает еще какого то кода. Вот и возникает вопрос, как получить полный код UTF для символа на русском языке (тот второй заветный байт?)? т.е ORD уже не подходит - так как эта ф-я выводит лишь первую часть кода - первый байт, а так как англ язык как раз помещается в первый байт, то ORD работает нормально, или я ее неправильно использую? Если у меня кривые руки, то хоть помогите исправить, а то реально не пойму что я делаю не так. С ORD вроде все норм, но с UTF не нормально работает, вобщем, есть ли станд ф-и аналоги ORD для UTF..

Почему я использую iconv: если делать просто
PHP код:
for ($i=0;$i<255;$i++)
{
    echo 
chr($i)."<br>";

то выводится только английский текст, русский же идет крякозябром.. в php.ini прописал дефолтную кодировку - UTF-8, в хедере html дока тоже прописано utf-8, сами доки *.рнр сохранены в кодировке utf-8.

Вобщем, посоветуйте как быть.
Это нужно для кодирования информации на сервере(лабораторная работа). Закодировать то я могу, а вот раскодировать - проблема- - не могу распознать символы, ну если я ставлю UTF кодировку. С ситуации я то выкрутился и поставил на сервере кодировки cp1251, ну и в самом доке, но это ж просто избегание проблемы, да и стойкость кодирования будет явно ниже, так как UTF содержит во наааааамного больше символов
"В будущем на рынке останется два вида компаний: те, кто в Интернет и те, кто вышел из бизнеса.."
(Билл Гейтс)

Последний раз редактировалось alex-chz; 31.03.2010 в 12:37.
alex-chz вне форума Ответить с цитированием
Старый 31.03.2010, 12:39   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Вам надо вывести в utf-8 символы ascii котырые соответсвуют символу в utf8?
С учётом этого, даже не знаю как обьяснить
PHP код:
for ($i=0;$i<=255;++$i) {
    
$letter=iconv('''UTF-8'chr($i));
       echo 
bin2hex($letter).'->'.$i.'->'.$letter.'<br>';

но этот код должен помочь
Стрелок-охотник

Последний раз редактировалось mv28jam; 31.03.2010 в 13:39.
mv28jam вне форума Ответить с цитированием
Старый 02.04.2010, 12:55   #3
alex-chz
Пользователь
 
Аватар для alex-chz
 
Регистрация: 03.03.2010
Сообщений: 10
По умолчанию

Цитата:
Сообщение от mv28jam Посмотреть сообщение
этот код должен помочь
Ну как сказать. Результат его выполнения вот
7b->123->{
7c->124->|
7d->125->}
7e->126->~
7f->127->
d082->128->Р‚
d083->129->Рѓ
e2809a->130->‚
d193->131->С“
e2809e->132->„
e280a6->133->…
e280a0->134->вЂ
e280a1->135->‡
e282ac->136->€
e280b0->137->‰
d089->138->Р‰
e280b9->139->‹
d08a->140->РЉ
d08c->141->РЊ
d08b->142->Р‹
d08f->143->РЏ
d192->144->С’
e28098->145->�br>e28099->146->’
e2809c->147->“
e2809d->148->”
e280a2->149->•
e28093->150->–
e28094->151->—
->152->
e284a2->153->в„ў
d199->154->С™
e280ba->155->›
d19a->156->Сљ
d19c->157->Сњ
d19b->158->С›
d19f->159->Сџ

Опять же спроблем с однобайтными нет, а вот двубайтные...
Ну вот например строка
e2809e->132->„
т.е шестнадцатиричной форме и ASCII коду соответствуют три символа:
в,Ђ,ћ. В принципе такое можно подчистить регулярными - ну например удалить "В" во всех строках, кроме упоминания ее в первый раз, но вот как узнать что я хотел отобразить, "в","Ђ" или все таки "ћ"?
"В будущем на рынке останется два вида компаний: те, кто в Интернет и те, кто вышел из бизнеса.."
(Билл Гейтс)

Последний раз редактировалось alex-chz; 02.04.2010 в 13:01.
alex-chz вне форума Ответить с цитированием
Старый 02.04.2010, 13:13   #4
alex-chz
Пользователь
 
Аватар для alex-chz
 
Регистрация: 03.03.2010
Сообщений: 10
По умолчанию

Цитата:
Сообщение от alex-chz Посмотреть сообщение
Опять же спроблем с однобайтными нет, а вот двубайтные...
пардон, все работает, я просто забыл сменить кодировку в .htaccess:
7d->125->}
7e->126->~
7f->127->
d082->128->Ђ
d083->129->Ѓ
e2809a->130->‚
d193->131->ѓ
e2809e->132->„
e280a6->133->…
e280a0->134->†
e280a1->135->‡
e282ac->136->€

mv28jam,спасибо большое, буду разбираться дальше=)
"В будущем на рынке останется два вида компаний: те, кто в Интернет и те, кто вышел из бизнеса.."
(Билл Гейтс)
alex-chz вне форума Ответить с цитированием
Старый 04.04.2010, 19:31   #5
alex-chz
Пользователь
 
Аватар для alex-chz
 
Регистрация: 03.03.2010
Сообщений: 10
По умолчанию

Интересно получается. При выполнении кода
PHP код:
echo "<h1>".chr(hexdec("d0a9"))."</h1>"
результат читаемым становится только при кодировке СР1251, а при переключении на сервере на UTF перестает работать..
"В будущем на рынке останется два вида компаний: те, кто в Интернет и те, кто вышел из бизнеса.."
(Билл Гейтс)
alex-chz вне форума Ответить с цитированием
Старый 05.04.2010, 11:17   #6
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

а так
PHP код:
iconv('''UTF-8'chr(hexdec("d0a9"))); 
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 05.04.2010, 12:45   #7
alex-chz
Пользователь
 
Аватар для alex-chz
 
Регистрация: 03.03.2010
Сообщений: 10
По умолчанию

Ну так скорее всего работать должно, но не хотелось бы каждый раз использовать iconv(). Немного позже попробую, отпишусь=)
"В будущем на рынке останется два вида компаний: те, кто в Интернет и те, кто вышел из бизнеса.."
(Билл Гейтс)
alex-chz вне форума Ответить с цитированием
Старый 03.09.2010, 09:13   #8
Алексей82
 
Регистрация: 26.02.2008
Сообщений: 7
По умолчанию

PHP код:
function ordUTF8($c$index 0, &$bytes null)
{
  
$len strlen($c);
  
$bytes 0;

  if (
$index >= $len)
    return 
false;

  
$h ord($c{$index});

  if (
$h <= 0x7F) {
    
$bytes 1;
    return 
$h;
  }
  else if (
$h 0xC2)
    return 
false;
  else if (
$h <= 0xDF && $index $len 1) {
    
$bytes 2;
    return (
$h 0x1F) <<  | (ord($c{$index 1}) & 0x3F);
  }
  else if (
$h <= 0xEF && $index $len 2) {
    
$bytes 3;
    return (
$h 0x0F) << 12 | (ord($c{$index 1}) & 0x3F) << 6
                             
| (ord($c{$index 2}) & 0x3F);
  }          
  else if (
$h <= 0xF4 && $index $len 3) {
    
$bytes 4;
    return (
$h 0x0F) << 18 | (ord($c{$index 1}) & 0x3F) << 12
                             
| (ord($c{$index 2}) & 0x3F) << 6
                             
| (ord($c{$index 3}) & 0x3F);
  }
  else
    return 
false;

Взято отсюда: http://ru.php.net/ord
Алексей82 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ansi в UTF-8 и наоборот UTF-8 в Ansi Alar Работа с сетью в Delphi 3 09.12.2010 17:02
UTF-8 alex171069 Общие вопросы C/C++ 1 18.05.2009 11:57
Использование функции ord.(paskal) netcher Помощь студентам 5 01.03.2009 21:30
кодировка UTF-8 nimf Общие вопросы Delphi 4 18.01.2009 19:25