|
|
|
| Всем добрый день, столкнулся с такой проблеммой
Есть кирилические буквы: И, Р, Э (заглавные):
так вот функция
iconv('windows-1251', 'UTF-8', 'И,Р,Э');
|
Отказывается их корректно переводить....почему и как быть? | |
|
|
|
|
|
|
|
для: chexov
(10.03.2011 в 08:19)
| | С чего вы взяли что некорректно? | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 08:37)
| | выводит вот такие символы:
что значит непечатаемый символ ? вобщем задумка сделать декодер через форму | |
|
|
|
|
|
|
|
для: chexov
(10.03.2011 в 08:44)
| | А причем тут iconv? Он без проблем ковертирует. Это у вас прием/вывод не в UTF значит, а от сюда и проблемы. | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 08:51)
| | Задумка написать свой декодер через форму делаю так
<?
function utf8_win($s){
$s= strtr ($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 (обязательное условие) | |
|
|
|
|
|
|
|
для: chexov
(10.03.2011 в 09:06)
| | РњР˜Р , РњРР - это будет результат после iconv слов МИР, МЭР.
PS. html-пердставление некоторых символов, это результат 1251 форума. Нет, не было и не будет проблем с конвертированием в iconv.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 09:12)
| | Я вам объясняю! при вводе в форму кирилицы и выбрав кодировку UTF-8 в результате должны увидеть на экране символы (в UTF-8), далее при вводе в форму символов в UTF-8 и выбрав кодировку Windows-1251 должны получить в результате кирилицу! что не понятного?
P.S:Содержимое файла в UTF-8! | |
|
|
|
|
|
|
|
для: chexov
(10.03.2011 в 09:20)
| | Я это понял, и какие проблемы?
Я вам показывал, что iconv конвертирует нормально то, с чем у вас почему-то проблемы.
И ему без разницы с чего и во что конвертировать. Есть одно замечание по данной функции, которое говорит, что "на некоторых платформах iconv может работать ненормально, в таких случаях рекомендуется установить библиотеку GNU libiconv". Что за платформы, я не знаю, ибо с проблемами подобными не встречался. | |
|
|
|
|
|
|
|
для: 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
В чем причина? | |
|
|
|
|
 6 байт |
|
|
для: chexov
(10.03.2011 в 09:38)
| | Это значит, что вы передаете ей строку совсем не в той кодировке, которую заявляете. И вообще, вы будете получать из формы не желаемое, то есть из 1251 в utf, например, а в той кодировке, в которой ваша страница. И коли она в utf, и хотят из 1251 в utf, то конвертировать ничего не надо, оно уже в utf, и наоборот.
В приложение слово РИМ пропущенное через iconv(). Если в Блокноте или Опера вы прочтете иное, тогда можете грешить, что iconv некорректо обрабатывает. | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 09:45)
| | как же быть? ведь вопрос: КАК сделать?
1. При вводе кирилицы в форму и указание кодировки UTF-8 результат: Символы UTF-8 (РњРР)
2. При вводе символов UTF-8 в форму и указание кодировки Win-1251 результат: Кирилица
При условии что содержимое файла в UTF-8, вот и все что прошу посоветовать. | |
|
|
|
|
|
|
|
для: chexov
(10.03.2011 в 09:49)
| | Не будет у вас ни кирилицы, ни латиницы, если у вас страница в UTF. Нужно получать от пользователя именно кирилицу, отдавайте страницу в 1251. | |
|
|
|
|
|
|
|
для: chexov
(10.03.2011 в 08:44)
| | Вы уже подкорректировали ответ, ибо до этого вы показывали html-пердставление.
Кто сазал, что "?" непечатный символ?
<?
iconv('windows-1251', 'UTF-8', 'Ира,Рома,Энгельс')
| выдаст на выходе Р˜СЂР°,Рама,Рнгельс | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 09:09)
| | я выше написал как я это делаю: нужно чтобы выводил UTF-8 символы при вводе руских в форму, и наоборот (что касаемо ваших примеров: суть в том что если слова закнчиваются на Р, Э, И или стоят вместе) | |
|
|
|
|
|
|
|
для: chexov
(10.03.2011 в 08:44)
| | Хм... а кодировка страницы какая (UTF-8 или Win-1251)? | |
|
|
|
|
|
|
|
для: 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 = 'КОРТИК'; выдает РљРћР РўР тоесть обрезает букву К почему так? | |
|
|
|
|
|
|
|
для: chexov
(11.03.2011 в 02:20)
| | Хм... вот чего не понимаю, а почему вы выводите в кодировке Win-1251 данные на странице, где указана кодировка UTF-8? Дело в том, что ряд последовательностей при такой постановке дела будут восприниматься как управляющие или невидимые символы. Тут сложно ожидать совпадения количества символов, так как они выводятся с искажением, что там реально доходит до отображения предсказать сложно. | |
|
|
|
|
|
|
|
для: cheops
(11.03.2011 в 11:32)
| | что посоветуете? как организовать сию задумку? | |
|
|
|
|
|
|
|
для: chexov
(14.03.2011 в 06:18)
| | Я если честно не очень понимаю задумку, т.е. какая задача решается. Вы хотите сформировать несколько результатов использующих разные кодировки или хотите подружить разные кодировки на сайте? | |
|
|
|
|
|
|
|
для: cheops
(14.03.2011 в 12:59)
| | Именно хочу отображать результаты введеной (через форму) информации в разных кодировках | |
|
|
|
|
|
|
|
для: chexov
(15.03.2011 в 04:37)
| | Вводятся крокозяблики? Т.е. вы хотите их расшифровать? Или вводится нормальный текст и вы хотите показать как он будет выглядить в разных кодировках, если на странице выбрана одна конекретная? | |
|
|
|
|
|
|
|
для: cheops
(15.03.2011 в 11:49)
| | первый вариант:
Вводим нормальный текст, выбираю из выпадающего списка кодировку и нужно чтобы показало как будет выглядеть текст в выбранной кодировке
второй вариант:
Вводим крокозяблики(UTF-8) выбираем из выпадающего списка кодировку (например Win1251) на выходе получаем нормальный текст (Расшифровываем)
Эти два варианта можно как то в один сделать? Страница постоянно в UTF-8 | |
|
|
|
|
|
|
|
для: chexov
(16.03.2011 в 03:51)
| | Первый вариант возможен.
>Страница постоянно в UTF-8
Вот из-за этого у вас вряд ли что получится, допустим пользователь доносит строку вида
Причем вместо знаков вопроса и 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;
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(16.03.2011 в 11:57)
| | эта функция не срабатывает:(из P?P?P возвращает P?P?P подскажите как переработать?
писал функцию (в посте 473263) но там проблема с буквами И,Р,Э | |
|
|
|
|
|
|
|
для: chexov
(17.03.2011 в 02:07)
| | Эта функция применялась давно, когда еще iconv() не всеми серверами поддерживался. Она предназначена для штатной работы, когда вы имеете дело с 2 байтами на символ, в крокозябликах в UTF-8 у вас их будет 4, их нужно исследовать и подставить (я попробую такую функцию написать, но не обещаю, что смогу выделить время на это). | |
|
|
|
|
|
|
|
для: cheops
(17.03.2011 в 12:37)
| | Очень прошу вас помочь мне с функцией, думаю она пригодится в дальнейшем не только мне:) буду ждать с нетерпением | |
|
|
|
|
|
|
|
для: cheops
(17.03.2011 в 12:37)
| | Уважаемый Хеопс, простите за мое нахальство, вы не рассматривали возможность написания функции? | |
|
|
|
|
|
|
|
для: chexov
(24.03.2011 в 10:04)
| | Рассматривал :))), даже начал, но до конца пока не довел... | |
|
|
|
|
|
|
|
для: chexov
(11.03.2011 в 02:20)
| | -
[поправлено модератором] | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|