[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Кракозябры в строковых функциях php
Eretic
Доброе время суток.

Наблюдаются кракозябры при использовании русского языка в строковых функциях 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();

$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 и значение ошибочной кодировки.
Не подскажете, как узнать название ошибочной кодировки по этим Ѳсѵ ѱѾѻэщѸѵ ѱуѺѲь символам?

Спустя 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) к своей,


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 smile.gif

Спустя 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(), теперь я кодировку любой строковой функции подчинить смогу.
Тему можно закрывать. Вопросов больше не имею. cool.gif

Спустя 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 (хоть в самих функциях, хоть скопом) тут вообще мимо кассы.

Спустя 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 написал(а):
Пробовали smile.gif
Третий пост сверху. Но автору хотелось разобраться именно с этим, совершенно некорректным примером. Что я так же отметил.
Однако знаний ради - позволительно.

Спустя 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" немного лучше, но всё равно работает не корректно. ВСё равно отображется много лишних символов. Подскажите, пожалуйста, что-нибудь. Заранее спасибо.


Спустя 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)
это из за того что страница у Вас в одной кодтровке а в базе используется другая

был бы признателен Вам, если бы Вы подсказали как это исправить unsure.gif

Спустя 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'");

крокозябры остались...ничего не меняется...хоть указываю я какую кодировку использовать, хоть не указываю....может есть ещё у кого какие-нибудь мысли, а то я уже с ума сходить начинаю wacko.gif

Спустя 10 месяцев, 12 дней, 18 часов, 38 минут, 36 секунд (20.05.2011 - 15:05) keysi_ написал(а):
re: strtr

Невероятно полезная и актуальная тема. Долго пользовался строковыми функциями в работе с win-1251, тут решил переехать на utf-8, и опа, казалось бы ни чего не менял и на тебе.
Кстати, что касается символов, гугл транслейт уверенно подставляемый языки кирилической группы, когда даешь ему символ из набора. Потом нашел, это оказывается символы из алфавита древне-славянского языка, пси, ять итп, вот такая интересная штука.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.