Наблюдаются кракозябры при использовании русского языка в строковых функциях strtr(), str_shuffle(), strrev()...
Пробовал найти решение через функции mb_string (http://www.php.net/manual/en/ref.mbstring.php).
Аналогов именно этих функций, среди функций mb_string - я не нашел.
Давайте сначала решим вопрос с одной из этих функций. - strtr()
Вот у меня следующий код:
$from = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
$to = "абвгдежзиклмнопрстуфхцчшщъыьэюя";
$str = "ВСЕ БОЛЬШИЕ БУКВЫ";
$str = strtr($str, $from, $to);
echo mb_convert_encoding ($str, "utf-8");
echo "<br>";
echo $str;
Выводится:
Ѳ�ѵ ѱѾѻьшѸѵ ѱуѺѲы
Ѳсѵ ѱѾѻьшѸѵ ѱуѺѲы
То есть, там где функция mb_convert_encoding должна была перевести текст в читабельный utf8 - она перевела в непонятный ѲÑ�ѵ ѱѾѻьшѸѵ ѱуѺѲы.
Возможно, следует использовать другую функцию?
Подскажите, пожалуйста, решение.
Спустя 1 час, 26 минут, 47 секунд (26.06.2010 - 16:02) Eretic написал(а):
Кстати, версия PHP - 5.3.1
Спустя 1 час, 18 минут, 36 секунд (26.06.2010 - 17:21) twin написал(а):
Не все строковые функции имеют аналоги в библиотеке mb. Допустим strtr() как раз и нету. Для корректной работы придется сначала сконвертировать в родную кодировку, потом обратно функцией iconv()
Впрочем она и не нужна в приведенном примере. Там нужна функция mb_strtolower();
Впрочем она и не нужна в приведенном примере. Там нужна функция mb_strtolower();
$str = "ВСЕ БОЛЬШИЕ БУКВЫ";
$str = mb_strtolower($str, 'utf-8');
echo "<br>";
echo $str;
Спустя 17 минут, 55 секунд (26.06.2010 - 17:39) qpayct написал(а):
Спустя 22 минуты, 36 секунд (26.06.2010 - 18:01) Eretic написал(а):
Как раз интересует решение, которое может сконвертировать в нужную кодировку.
Ведь strtr не единственная функция...
Для функции iconv(), как я понял, нужно указать две кодировки: UTF-8 и значение ошибочной кодировки.
Не подскажете, как узнать название ошибочной кодировки по этим Ѳсѵ ѱѾѻэщѸѵ ѱуѺѲь символам?
Ведь strtr не единственная функция...
Для функции iconv(), как я понял, нужно указать две кодировки: UTF-8 и значение ошибочной кодировки.
Не подскажете, как узнать название ошибочной кодировки по этим Ѳсѵ ѱѾѻэщѸѵ ѱуѺѲь символам?
Спустя 1 час, 26 минут, 31 секунда (26.06.2010 - 19:28) twin написал(а):
Вообще способов много, но ни один не дает 100% результата.
Вот один из них
Вот один из них
function get_charset($string)но это плохая идея. Если есть возможность получить кодировку явно, лучше не рисковать.
{
if($string == iconv('utf-8', 'utf-8', $string))
return 'utf-8';
elseif($string == iconv('windows-1251', 'windows-1251', $string))
return 'windows-1251';
elseif($string == iconv('koi8-r', 'koi8-r', $string))
return 'koi8-r';
}
Спустя 2 часа, 16 минут, 25 секунд (26.06.2010 - 21:44) Eretic написал(а):
Решил все таки разобраться с чудо-кодировкой конкретно.
1) В браузере перебрал в свойствах (вид, кодировка) всевозможные кодировки - ни одна не вернула символам Ѳсѵ ѱѣѺѲѫ ѱѾѻѬѨѸѵ - читабельный вид.
2) Попробовал внутри в php коде вставить Ѳсѵ ѱѣѺѲѫ ѱѾѻѬѨѸѵ и через Notepade++ преоразовывать в различные кодировки. Результат как в п.1
3)Через Яндекс поиск вышел на страницу, где коллекция кракозябров http://www.seobuilding.ru/wiki/Кракозябры , через поиск Ctrl+F пытался найти эти символы.
4)Применил функцию get_charset($string) к своей,
и на экран вывелось:
utf-8;
затем попробовал вместо
строчку
И опять вывелись Ѳсѵ ѱѣѺѲѫ ѱѾѻѬѨѸѵ .
Что же получается? - Строковые функции возвращают utf-8 но в таком вот нечитабельном виде?
Немного запутался.
Как же получаются эти символы?
И у всех так? или только у меня?
Вообще, с этим примером и похожими столкнулся, изучая книгу Самоучитель PHP 5/6 главу строковые функции. Но там в примере почему то все так гладко выходит... Даже без использования mb_string
1) В браузере перебрал в свойствах (вид, кодировка) всевозможные кодировки - ни одна не вернула символам Ѳсѵ ѱѣѺѲѫ ѱѾѻѬѨѸѵ - читабельный вид.
2) Попробовал внутри в php коде вставить Ѳсѵ ѱѣѺѲѫ ѱѾѻѬѨѸѵ и через Notepade++ преоразовывать в различные кодировки. Результат как в п.1
3)Через Яндекс поиск вышел на страницу, где коллекция кракозябров http://www.seobuilding.ru/wiki/Кракозябры , через поиск Ctrl+F пытался найти эти символы.
4)Применил функцию get_charset($string) к своей,
function get_charset($string)
{
if($string == iconv('utf-8', 'utf-8', $string))
return 'utf-8';
elseif($string == iconv('windows-1251', 'windows-1251', $string))
return 'windows-1251';
elseif($string == iconv('koi8-r', 'koi8-r', $string))
return 'koi8-r';
}
$from = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
$to = "абвгдежзиклмнопрстуфхцчшщъыьэюя";
$str = "ВСЕ БУКВЫ БОЛЬШИЕ";
$str = strtr($str, $from, $to);
echo get_charset($str);
и на экран вывелось:
utf-8;
затем попробовал вместо
echo get_charset($str);
строчку
echo iconv('utf-8', 'utf-8', $str);
И опять вывелись Ѳсѵ ѱѣѺѲѫ ѱѾѻѬѨѸѵ .
Что же получается? - Строковые функции возвращают utf-8 но в таком вот нечитабельном виде?
Немного запутался.
Как же получаются эти символы?
И у всех так? или только у меня?
Вообще, с этим примером и похожими столкнулся, изучая книгу Самоучитель PHP 5/6 главу строковые функции. Но там в примере почему то все так гладко выходит... Даже без использования mb_string
Спустя 18 минут, 10 секунд (26.06.2010 - 22:02) twin написал(а):
Дело в том, что функция strtr() работает с однобайтными кодировками. А кирилица в utf-8 многобайтная. То есть на выходе получается по половине символа, что разумеется не соответствует ни какой таблице сопоставления. Отсюда и кракозяблы.
Чтобы работало корректно, нужно сконвертировать данные. Тоесть перевести из многобайтной в однобайтную. А чтобы знать откуда конвертировать, нужно определить кодировку. Вот эта функция и пытается это сделать.
Чтобы работало корректно, нужно сконвертировать данные. Тоесть перевести из многобайтной в однобайтную. А чтобы знать откуда конвертировать, нужно определить кодировку. Вот эта функция и пытается это сделать.
function get_charset($string)пример, к слову, крайне неудачный.
{
if($string == iconv('utf-8', 'utf-8', $string))
return 'utf-8';
elseif($string == iconv('windows-1251', 'windows-1251', $string))
return 'windows-1251';
elseif($string == iconv('koi8-r', 'koi8-r', $string))
return 'koi8-r';
else
return 'utf-8'; //дефолтная желательна
}
$str = "ВСЕ БУКВЫ БОЛЬШИЕ";
$str = iconv(get_charset($str), 'windows-1251', $str);
$from = iconv('utf-8', 'windows-1251', "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ");
$to = iconv('utf-8', 'windows-1251', "абвгдежзиклмнопрстуфхцчшщъыьэюя");
$str = strtr($str, $from, $to);
$str = iconv('windows-1251', 'utf-8', $str);
echo $str;
Спустя 18 минут, 23 секунды (26.06.2010 - 22:21) Eretic написал(а):
twin, спасибо вам за подробный ответ.
Теперь все понятно не только с функцией strtr(), теперь я кодировку любой строковой функции подчинить смогу.
Тему можно закрывать. Вопросов больше не имею.
Теперь все понятно не только с функцией strtr(), теперь я кодировку любой строковой функции подчинить смогу.
Тему можно закрывать. Вопросов больше не имею.
Спустя 1 день, 15 часов, 18 минут, 45 секунд (28.06.2010 - 13:39) linker написал(а):
На самом деле, вы немного не добрались до истины. Прежде чем конвертить, нужно было установить текущую кодировку для самого mb_string
либо передать текущую кодировку третьим параметром
$Encoding='Windows-1251';
mb_internal_encoding($Encoding);
либо передать текущую кодировку третьим параметром
mb_convert_encoding($str, 'UTF-8', 'Windows-1251');
Спустя 2 минуты, 48 секунд (28.06.2010 - 13:42) twin написал(а):
И что это даст в приведенном примере?
Спустя 2 минуты, 13 секунд (28.06.2010 - 13:44) linker написал(а):
Цитата (twin @ 28.06.2010 - 10:42) |
И чсто это даст в приведенном примере? |
Избавление от кракозабр при правильном хидере
header('Content-Type: text/html; charset=utf-8');
Спустя 5 минут, 35 секунд (28.06.2010 - 13:50) twin написал(а):
Нет, не поможет. ))
Вся беда как раз в том, что у strtr() нет аналога в mb библиотеке. А указание кодировки для mb (хоть в самих функциях, хоть скопом) тут вообще мимо кассы.
Вся беда как раз в том, что у strtr() нет аналога в mb библиотеке. А указание кодировки для mb (хоть в самих функциях, хоть скопом) тут вообще мимо кассы.
Спустя 9 минут, 2 секунды (28.06.2010 - 13:59) linker написал(а):
Цитата (twin @ 28.06.2010 - 10:50) |
Нет, не поможет. )) Вся беда как раз в том, что у strtr() нет аналога в mb библиотеке. А указание кодировки для mb (хоть в самих функциях, хоть скопом) тут вообще мимо кассы. |
Ну тогда просто mb_strtolower() не пробовали? Судя по вашему примеру - очень подходит.
Спустя 4 минуты, 40 секунд (28.06.2010 - 14:04) twin написал(а):
Пробовали
Третий пост сверху. Но автору хотелось разобраться именно с этим, совершенно некорректным примером. Что я так же отметил.
Однако знаний ради - позволительно.
Третий пост сверху. Но автору хотелось разобраться именно с этим, совершенно некорректным примером. Что я так же отметил.
Однако знаний ради - позволительно.
Спустя 7 дней, 9 часов, 50 минут, 20 секунд (5.07.2010 - 23:54) Dever написал(а):
привет всем, я из начинающих... Вопрос такого плана: Помогите разобраться с мозилой. Вместо кирилицы на экране отображается всякая билиберда. В опере и IE всё чудесно работает.
Например:
<?php
echo "Привет";
?> - выводится кракозябр....но эта проблема только в мозиле. В др. браузерах всё нормально.
'Content-Type: text/html; charset=utf-8' - при таком раскладе выдаёт краказябр, вот так content="text/html; charset=windows-1251" немного лучше, но всё равно работает не корректно. ВСё равно отображется много лишних символов. Подскажите, пожалуйста, что-нибудь. Заранее спасибо.
Например:
<?php
echo "Привет";
?> - выводится кракозябр....но эта проблема только в мозиле. В др. браузерах всё нормально.
'Content-Type: text/html; charset=utf-8' - при таком раскладе выдаёт краказябр, вот так content="text/html; charset=windows-1251" немного лучше, но всё равно работает не корректно. ВСё равно отображется много лишних символов. Подскажите, пожалуйста, что-нибудь. Заранее спасибо.
Спустя 22 часа, 57 минут, 13 секунд (6.07.2010 - 22:51) Dever написал(а):
Здраствуйте ещё раз....вот ещё заметил такую штуку, например, когда яв полях ввожу значения и нажимаю добавить в базу заносятся кракозябры....Что делать? Подскажите, плиз, очень надо.
Спустя 1 минута, 53 секунды (6.07.2010 - 22:53) Guest написал(а):
Цитата (Dever @ 6.07.2010 - 19:51) |
Здраствуйте ещё раз....вот ещё заметил такую штуку, например, когда яв полях ввожу значения и нажимаю добавить в базу заносятся кракозябры....Что делать? Подскажите, плиз, очень надо. |
P.S. причём кракозябры добавляются из любого браузера.
SOS, SOS, SOS
Спустя 4 минуты, 14 секунд (6.07.2010 - 22:57) Basili4 написал(а):
это из за того что страница у Вас в одной кодтровке а в базе используется другая
Спустя 11 часов, 10 минут, 4 секунды (7.07.2010 - 10:07) Guest написал(а):
Цитата (Basili4 @ 6.07.2010 - 19:57) |
это из за того что страница у Вас в одной кодтровке а в базе используется другая |
был бы признателен Вам, если бы Вы подсказали как это исправить
Спустя 7 минут, 18 секунд (7.07.2010 - 10:15) twin написал(а):
Для начала почитай тут.
Спустя 10 часов, 11 минут, 53 секунды (7.07.2010 - 20:27) Dever написал(а):
Цитата (twin @ 7.07.2010 - 07:15) |
Для начала почитай тут. |
спасибо прочитал статью...позновательная конечно, но она не решила моей проблемы - у меня имеется вот такой код, где я выполняю проверки и указываю какую кодировку использовать
if(!$db)
exit("<P>В настоящий момент сервер базы данных не
доступен, поэтому корректное отображение
страницы невозможно.</P>" );
// Выбираем базу данных
if(! @mysql_select_db("firstbd",$db))
exit("<P>В настоящий момент база данных не доступна,
поэтому корректное отображение страницы
невозможно.</P>" );
@mysql_query("SET NAMES 'utf8'");
крокозябры остались...ничего не меняется...хоть указываю я какую кодировку использовать, хоть не указываю....может есть ещё у кого какие-нибудь мысли, а то я уже с ума сходить начинаю
Спустя 10 месяцев, 12 дней, 18 часов, 38 минут, 36 секунд (20.05.2011 - 15:05) keysi_ написал(а):
re: strtr
Невероятно полезная и актуальная тема. Долго пользовался строковыми функциями в работе с win-1251, тут решил переехать на utf-8, и опа, казалось бы ни чего не менял и на тебе.
Кстати, что касается символов, гугл транслейт уверенно подставляемый языки кирилической группы, когда даешь ему символ из набора. Потом нашел, это оказывается символы из алфавита древне-славянского языка, пси, ять итп, вот такая интересная штука.
Невероятно полезная и актуальная тема. Долго пользовался строковыми функциями в работе с win-1251, тут решил переехать на utf-8, и опа, казалось бы ни чего не менял и на тебе.
Кстати, что касается символов, гугл транслейт уверенно подставляемый языки кирилической группы, когда даешь ему символ из набора. Потом нашел, это оказывается символы из алфавита древне-славянского языка, пси, ять итп, вот такая интересная штука.