Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: 3 символа в UTF-8
 
 автор: chexov   (10.03.2011 в 08:19)   письмо автору
 
 

Всем добрый день, столкнулся с такой проблеммой

Есть кирилические буквы: И, Р, Э (заглавные):

так вот функция
iconv('windows-1251', 'UTF-8', 'И,Р,Э'); 


Отказывается их корректно переводить....почему и как быть?

  Ответить  
 
 автор: sim5   (10.03.2011 в 08:37)   письмо автору
 
   для: chexov   (10.03.2011 в 08:19)
 

С чего вы взяли что некорректно?

  Ответить  
 
 автор: chexov   (10.03.2011 в 08:44)   письмо автору
 
   для: sim5   (10.03.2011 в 08:37)
 

выводит вот такие символы:

Р?,Р ,Р


что значит непечатаемый символ ? вобщем задумка сделать декодер через форму

  Ответить  
 
 автор: sim5   (10.03.2011 в 08:51)   письмо автору
 
   для: chexov   (10.03.2011 в 08:44)
 

А причем тут iconv? Он без проблем ковертирует. Это у вас прием/вывод не в UTF значит, а от сюда и проблемы.

  Ответить  
 
 автор: chexov   (10.03.2011 в 09:06)   письмо автору
 
   для: sim5   (10.03.2011 в 08:51)
 

Задумка написать свой декодер через форму делаю так
<?
function utf8_win($s){
$sstrtr ($s, array ("Р°"=>"а""Рђ"=>"А""Р±"=>"б"
"Р‘"=>"Б""РІ"=>"в""Р’"=>"В""Рі"=>"г""Р“"=>"Г"
"Рґ"=>"д""Р”"=>"Д""Рµ"=>"е""Р•"=>"Е""С‘"=>"ё"
"РЃ"=>"Ё""Р¶"=>"ж""Р–"=>"Ж""Р·"=>"з""Р—"=>"З"
"Рё"=>"и""Р"=>"И""Р№"=>"й""Р™"=>"Й""Рє"=>"к"
"Рљ"=>"К""Р»"=>"л""Р›"=>"Л""Рј"=>"м""Рњ"=>"М"
"РЅ"=>"н""Рќ"=>"Н""Рѕ"=>"о""Рћ"=>"О""Рї"=>"п"
"Рџ"=>"П""СЂ"=>"р""Р "=>"Р""СЃ"=>"с""РЎ"=>"С"
"С‚"=>"т""Рў"=>"Т""Сѓ"=>"у""РЈ"=>"У""С„"=>"ф"
"Р¤"=>"Ф""С…"=>"х""РҐ"=>"Х""С†"=>"ц""Р¦"=>"Ц"
"С‡"=>"ч""Р§"=>"Ч""С€"=>"ш""РЁ"=>"Ш""С‰"=>"щ"
"Р©"=>"Щ""СЉ"=>"ъ""РЄ"=>"Ъ""С‹"=>"ы""Р«"=>"Ы"
"СЊ"=>"ь""Р¬"=>"Ь""СЌ"=>"э""Р­"=>"Э""СЋ"=>"ю"
"Р®"=>"Ю""СЏ"=>"я""РЇ"=>"Я"));
return 
$s;
}
?>

и собственно сама форма и обработчик:
<?
echo "Введите начальный текст:";
echo 
"<form action='' method='post'>";
echo 
"<textarea type='text' name='stekst' cols='25' rows='5'></textarea><br/>";
echo 
"Кодировка:<br/><select name='cod'/>";
echo 
"<option value=1'>UTF-8
          <option value='2'>Win-1251"
;
echo 
"</select> ";
echo 
"<input type='submit' name='goo' value='Кодировать'/>";
echo 
"</form>";

if (!empty(
$_POST['stekst']) && is_numeric($_POST['cod']))
  {
  
$tekst $_POST['stekst'];
  if (
$_POST['cod']=='1')         $tekst iconv('windows-1251''UTF-8'$tekst);
  elseif (
$_POST['cod']=='2'$tekst utf8_win($tekst);
  
  echo 
"Кодированный текст:";
  echo 
"<textarea type='text'>".$tekst."</textarea>";
  }
?>


Слово МИР, МЭР и многие другие с участием этих букв не кодируется в UTF-8 почему?
ФАЙЛ в UTF-8 (обязательное условие)

  Ответить  
 
 автор: sim5   (10.03.2011 в 09:12)   письмо автору
 
   для: chexov   (10.03.2011 в 09:06)
 

РњР&#152;Р , РњР­Р - это будет результат после iconv слов МИР, МЭР.

PS. html-пердставление некоторых символов, это результат 1251 форума. Нет, не было и не будет проблем с конвертированием в iconv.

[поправлено модератором]

  Ответить  
 
 автор: chexov   (10.03.2011 в 09:20)   письмо автору
 
   для: sim5   (10.03.2011 в 09:12)
 

Я вам объясняю! при вводе в форму кирилицы и выбрав кодировку UTF-8 в результате должны увидеть на экране символы (в UTF-8), далее при вводе в форму символов в UTF-8 и выбрав кодировку Windows-1251 должны получить в результате кирилицу! что не понятного?
P.S:Содержимое файла в UTF-8!

  Ответить  
 
 автор: sim5   (10.03.2011 в 09:25)   письмо автору
 
   для: chexov   (10.03.2011 в 09:20)
 

Я это понял, и какие проблемы?
Я вам показывал, что iconv конвертирует нормально то, с чем у вас почему-то проблемы.
И ему без разницы с чего и во что конвертировать. Есть одно замечание по данной функции, которое говорит, что "на некоторых платформах iconv может работать ненормально, в таких случаях рекомендуется установить библиотеку GNU libiconv". Что за платформы, я не знаю, ибо с проблемами подобными не встречался.

  Ответить  
 
 автор: chexov   (10.03.2011 в 09:38)   письмо автору
 
   для: sim5   (10.03.2011 в 09:25)
 

При конвертации слова РИМ вылазит ошибка: Notice: iconv() [function.iconv]: Detected an illegal character in input string in D:\server\Apache\htdocs\index.php on line 20
В чем причина?

  Ответить  
 
 автор: sim5   (10.03.2011 в 09:45)   письмо автору
6 байт
 
   для: chexov   (10.03.2011 в 09:38)
 

Это значит, что вы передаете ей строку совсем не в той кодировке, которую заявляете. И вообще, вы будете получать из формы не желаемое, то есть из 1251 в utf, например, а в той кодировке, в которой ваша страница. И коли она в utf, и хотят из 1251 в utf, то конвертировать ничего не надо, оно уже в utf, и наоборот.

В приложение слово РИМ пропущенное через iconv(). Если в Блокноте или Опера вы прочтете иное, тогда можете грешить, что iconv некорректо обрабатывает.

  Ответить  
 
 автор: chexov   (10.03.2011 в 09:49)   письмо автору
 
   для: sim5   (10.03.2011 в 09:45)
 

как же быть? ведь вопрос: КАК сделать?

1. При вводе кирилицы в форму и указание кодировки UTF-8 результат: Символы UTF-8 (РњР­Р)
2. При вводе символов UTF-8 в форму и указание кодировки Win-1251 результат: Кирилица

При условии что содержимое файла в UTF-8, вот и все что прошу посоветовать.

  Ответить  
 
 автор: sim5   (10.03.2011 в 09:54)   письмо автору
 
   для: chexov   (10.03.2011 в 09:49)
 

Не будет у вас ни кирилицы, ни латиницы, если у вас страница в UTF. Нужно получать от пользователя именно кирилицу, отдавайте страницу в 1251.

  Ответить  
 
 автор: sim5   (10.03.2011 в 09:09)   письмо автору
 
   для: chexov   (10.03.2011 в 08:44)
 

Вы уже подкорректировали ответ, ибо до этого вы показывали html-пердставление.

Кто сазал, что "?" непечатный символ?
<?
iconv
('windows-1251''UTF-8''Ира,Рома,Энгельс')
выдаст на выходе Р&#152;СЂР°,Рама,Энгельс

  Ответить  
 
 автор: chexov   (10.03.2011 в 09:11)   письмо автору
 
   для: sim5   (10.03.2011 в 09:09)
 

я выше написал как я это делаю: нужно чтобы выводил UTF-8 символы при вводе руских в форму, и наоборот (что касаемо ваших примеров: суть в том что если слова закнчиваются на Р, Э, И или стоят вместе)

  Ответить  
 
 автор: cheops   (10.03.2011 в 11:36)   письмо автору
 
   для: chexov   (10.03.2011 в 08:44)
 

Хм... а кодировка страницы какая (UTF-8 или Win-1251)?

  Ответить  
 
 автор: chexov   (11.03.2011 в 02:20)   письмо автору
 
   для: cheops   (10.03.2011 в 11:36)
 

кодировка страницы UTF-8

как говорил SIM-5

iconv('windows-1251', 'UTF-8', '$str');

и
iconv('UTF-8', 'windows-1251', '$str');


работает, НО буква "И" отказывается нормально переводиться, например при $str = 'ИИИ'; выдает один символ: P?, а должен 3 символа (Р?Р?P?) или если $str = 'КОРТИК'; выдает РљРћР РўР тоесть обрезает букву К почему так?

  Ответить  
 
 автор: cheops   (11.03.2011 в 11:32)   письмо автору
 
   для: chexov   (11.03.2011 в 02:20)
 

Хм... вот чего не понимаю, а почему вы выводите в кодировке Win-1251 данные на странице, где указана кодировка UTF-8? Дело в том, что ряд последовательностей при такой постановке дела будут восприниматься как управляющие или невидимые символы. Тут сложно ожидать совпадения количества символов, так как они выводятся с искажением, что там реально доходит до отображения предсказать сложно.

  Ответить  
 
 автор: chexov   (14.03.2011 в 06:18)   письмо автору
 
   для: cheops   (11.03.2011 в 11:32)
 

что посоветуете? как организовать сию задумку?

  Ответить  
 
 автор: cheops   (14.03.2011 в 12:59)   письмо автору
 
   для: chexov   (14.03.2011 в 06:18)
 

Я если честно не очень понимаю задумку, т.е. какая задача решается. Вы хотите сформировать несколько результатов использующих разные кодировки или хотите подружить разные кодировки на сайте?

  Ответить  
 
 автор: chexov   (15.03.2011 в 04:37)   письмо автору
 
   для: cheops   (14.03.2011 в 12:59)
 

Именно хочу отображать результаты введеной (через форму) информации в разных кодировках

  Ответить  
 
 автор: cheops   (15.03.2011 в 11:49)   письмо автору
 
   для: chexov   (15.03.2011 в 04:37)
 

Вводятся крокозяблики? Т.е. вы хотите их расшифровать? Или вводится нормальный текст и вы хотите показать как он будет выглядить в разных кодировках, если на странице выбрана одна конекретная?

  Ответить  
 
 автор: chexov   (16.03.2011 в 03:51)   письмо автору
 
   для: cheops   (15.03.2011 в 11:49)
 

первый вариант:
Вводим нормальный текст, выбираю из выпадающего списка кодировку и нужно чтобы показало как будет выглядеть текст в выбранной кодировке

второй вариант:
Вводим крокозяблики(UTF-8) выбираем из выпадающего списка кодировку (например Win1251) на выходе получаем нормальный текст (Расшифровываем)

Эти два варианта можно как то в один сделать? Страница постоянно в UTF-8

  Ответить  
 
 автор: cheops   (16.03.2011 в 11:57)   письмо автору
 
   для: chexov   (16.03.2011 в 03:51)
 

Первый вариант возможен.
>Страница постоянно в UTF-8
Вот из-за этого у вас вряд ли что получится, допустим пользователь доносит строку вида
P?P?P

Причем вместо знаков вопроса и P - там настоящие символы, которые означают слово МИР в кодировке UTF-8, но которая отобразилась в однобайтовой кодировке Win-1251. Как только эта строка попадет в с реду UTF-8, она под каждый символ выделит свое количество байт, т.е. вместо 6 символов, которые видны искаженно в Win-1251, в UTF-8 под эту строку будет отведено условно говоря 12 символов, на самом деле меньше, но суть в том, что она будет их воспринимать как отделные символы и ни за что два соседних симола не склеет в одну строку. Т.е. iconv() для этой задачи не подходит, вам придется писать свои функции.

У вас ведь всегда будет русский язык? Тогда вам нужны будут функции вида (функцию нужно будет перерабатывать)
<?php
function utf8ToWin1251($s)
{
    
$s=str_replace("\xD0\xB0","а",$s);  $s=str_replace("\xD0\x90","А",$s);
    
$s=str_replace("\xD0\xB1","б",$s);  $s=str_replace("\xD0\x91","Б",$s);
    
$s=str_replace("\xD0\xB2","в",$s);  $s=str_replace("\xD0\x92","В",$s);
    
$s=str_replace("\xD0\xB3","г",$s);  $s=str_replace("\xD0\x93","Г",$s);
    
$s=str_replace("\xD0\xB4","д",$s);  $s=str_replace("\xD0\x94","Д",$s);
    
$s=str_replace("\xD0\xB5","е",$s);  $s=str_replace("\xD0\x95","Е",$s);
    
$s=str_replace("\xD1\x91","ё",$s);  $s=str_replace("\xD0\x81","Ё",$s);
    
$s=str_replace("\xD0\xB6","ж",$s);  $s=str_replace("\xD0\x96","Ж",$s);
    
$s=str_replace("\xD0\xB7","з",$s);  $s=str_replace("\xD0\x97","З",$s);
    
$s=str_replace("\xD0\xB8","и",$s);  $s=str_replace("\xD0\x98","И",$s);
    
$s=str_replace("\xD0\xB9","й",$s);  $s=str_replace("\xD0\x99","Й",$s);
    
$s=str_replace("\xD0\xBA","к",$s);  $s=str_replace("\xD0\x9A","К",$s);
    
$s=str_replace("\xD0\xBB","л",$s);  $s=str_replace("\xD0\x9B","Л",$s);
    
$s=str_replace("\xD0\xBC","м",$s);  $s=str_replace("\xD0\x9C","М",$s);
    
$s=str_replace("\xD0\xBD","н",$s);  $s=str_replace("\xD0\x9D","Н",$s);
    
$s=str_replace("\xD0\xBE","о",$s);  $s=str_replace("\xD0\x9E","О",$s);
    
$s=str_replace("\xD0\xBF","п",$s);  $s=str_replace("\xD0\x9F","П",$s);
    
$s=str_replace("\xD1\x80","р",$s);  $s=str_replace("\xD0\xA0","Р",$s);
    
$s=str_replace("\xD1\x81","с",$s);  $s=str_replace("\xD0\xA1","С",$s);
    
$s=str_replace("\xD1\x82","т",$s);  $s=str_replace("\xD0\xA2","Т",$s);
    
$s=str_replace("\xD1\x83","у",$s);  $s=str_replace("\xD0\xA3","У",$s);
    
$s=str_replace("\xD1\x84","ф",$s);  $s=str_replace("\xD0\xA4","Ф",$s);
    
$s=str_replace("\xD1\x85","х",$s);  $s=str_replace("\xD0\xA5","Х",$s);
    
$s=str_replace("\xD1\x86","ц",$s);  $s=str_replace("\xD0\xA6","Ц",$s);
    
$s=str_replace("\xD1\x87","ч",$s);  $s=str_replace("\xD0\xA7","Ч",$s);
    
$s=str_replace("\xD1\x88","ш",$s);  $s=str_replace("\xD0\xA8","Ш",$s);
    
$s=str_replace("\xD1\x89","щ",$s);  $s=str_replace("\xD0\xA9","Щ",$s);
    
$s=str_replace("\xD1\x8A","ъ",$s);  $s=str_replace("\xD0\xAA","Ъ",$s);
    
$s=str_replace("\xD1\x8B","ы",$s);  $s=str_replace("\xD0\xAB","Ы",$s);
    
$s=str_replace("\xD1\x8C","ь",$s);  $s=str_replace("\xD0\xAC","Ь",$s);
    
$s=str_replace("\xD1\x8D","э",$s);  $s=str_replace("\xD0\xAD","Э",$s);
    
$s=str_replace("\xD1\x8E","ю",$s);  $s=str_replace("\xD0\xAE","Ю",$s);
    
$s=str_replace("\xD1\x8F","я",$s);  $s=str_replace("\xD0\xAF","Я",$s);
    return 
$s;
}
?>

  Ответить  
 
 автор: chexov   (17.03.2011 в 02:07)   письмо автору
 
   для: cheops   (16.03.2011 в 11:57)
 

эта функция не срабатывает:(из P?P?P возвращает P?P?P подскажите как переработать?

писал функцию (в посте 473263) но там проблема с буквами И,Р,Э

  Ответить  
 
 автор: cheops   (17.03.2011 в 12:37)   письмо автору
 
   для: chexov   (17.03.2011 в 02:07)
 

Эта функция применялась давно, когда еще iconv() не всеми серверами поддерживался. Она предназначена для штатной работы, когда вы имеете дело с 2 байтами на символ, в крокозябликах в UTF-8 у вас их будет 4, их нужно исследовать и подставить (я попробую такую функцию написать, но не обещаю, что смогу выделить время на это).

  Ответить  
 
 автор: chexov   (17.03.2011 в 14:00)   письмо автору
 
   для: cheops   (17.03.2011 в 12:37)
 

Очень прошу вас помочь мне с функцией, думаю она пригодится в дальнейшем не только мне:) буду ждать с нетерпением

  Ответить  
 
 автор: chexov   (24.03.2011 в 10:04)   письмо автору
 
   для: cheops   (17.03.2011 в 12:37)
 

Уважаемый Хеопс, простите за мое нахальство, вы не рассматривали возможность написания функции?

  Ответить  
 
 автор: cheops   (24.03.2011 в 10:13)   письмо автору
 
   для: chexov   (24.03.2011 в 10:04)
 

Рассматривал :))), даже начал, но до конца пока не довел...

  Ответить  
 
 автор: sim5   (12.03.2011 в 06:37)   письмо автору
 
   для: chexov   (11.03.2011 в 02:20)
 

-

[поправлено модератором]

  Ответить  
 
 автор: levsha   (25.03.2011 в 16:27)   письмо автору
 
   для: chexov   (10.03.2011 в 08:19)
 

Обязательно использовать iconv?
Попробуйте расширение mb_string.
Как использовать.
В начале скрипта укажите внутреннюю кодировку, тогда в php все принятые данные и заголовки (post, get и т.д.) будут в этой кодировке - mb_internal_encoding('UTF-8');
Сам скрипт должен быть в формате UTF-8 и без BOM
Перекодировать данные можно так: mb_convert_encoding('строка', 'другая_кодировка', 'текущая кодировка'). Последний параметр не обязателен, используется значение mb_internal_encoding.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования