LINUX.ORG.RU

[php] Транслитерация символов, слетает кодировка

 


0

0

Сделал транслитерирующую функцию:

function transliterate($word)
{
$rus=array(
'й','ц','у','к','е','н','г','ш','щ','з','х','ф','ы','в','а','п','р',
'о','л','д','ж','э','я','ч','с','м','и','т','б','ю','ъ','ь','ё',' '
);
$eng=array(
'y','c','u','k','e','n','g','sh','sch','z','h','f','i','v','a','p','r',
'o','l','d','j','e','ya','ch','c','m','i','t','b','yu','',''.'yo',''
);

$ln=strlen($word);
$outword='';

for($i=0;$i<$ln;$i++)
{
$cur_let=substr($word,$i,1);

for($j=0;$j<count($rus);$j++)
{
if($cur_let==$rus[$j]) { echo $outword.=$eng[$j]; break; }
}
}

return $outword;
}

Когда проходит второй цикл (со счетчиком $j), переменная $cur_let мифическим образом меняет кодировку на неизвестную, т.е. когда я делаю echo $cur_let, то выводит черный кружок со знаком вопроса внутри.

Локаль Arch'а - en_US.UTF8, кодировка file.php - UTF-8, строку передаю из того же файла, transliterate("ололо")

ЧЯДНТ?

Все, уже не нужно. Применил уличную магию

$transliterate=array("а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"= >"yo","ж"=>"j","з"=>"z","и"=>"i","й"=>"i","к"=>"k","л"=>"l","м"=>"m","н"=>"n","о "=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t","у"=>"y","ф"=>"f","х"=>"h","ц"=>"c"," ч"=>"ch", "ш"=>"sh","щ"=>"sh","ы"=>"i","э"=>"e","ю"=>"u","я"=>"ya",
"ь"=>"","Ь"=>"","ъ"=>"","Ъ"=>"");

strtr("ололо",$transliterate)

NiggasLife
() автор топика

Если не включен mbstring.func_overload (или как он там) strlen возвращает длину в байтах, а не в символах. Используй в этом случае mb_strlen.

Ну и смотри, что у тебя в настройках mbstring. На этой почве и автодетект слететь может, или ещё что-то вылезти.

...

Могу своими настройками поделиться:

default_charset = "utf-8"
mbstring.language = Russian
mbstring.internal_encoding = UTF-8
mbstring.func_overload = 0
Всё остальное в mbstring не задано.

overload одно время использовал, но лезли глюки с некоторыми сторонними софтинами, плюс проблемы фреймворка на сторонних хостингах вылезали, так что отказался и просто определяю свои функции при старте. Типа:

if(function_exists('mb_strtolower') && config('internal_charset') == 'utf-8')
{
    eval('function bors_upper($str) { return mb_strtoupper($str); }');
    eval('function bors_lower($str) { return mb_strtolower($str); }');
    eval('function bors_strlen($str) { return mb_strlen($str); }');
    eval('function bors_substr($str, $start, $length=NULL) { return is_null($length) ? mb_substr($str, $start) : mb_substr($str, $start, $length); }');
    eval('function bors_strpos($str, $need, $start=NULL) { return is_null($start) ? mb_strpos($str, $need) : mb_strpos($str, $need, $start); }');
}
else
{
    eval('function bors_lower($str) { return strtolower($str); }');
    eval('function bors_upper($str) { return strtoupper($str); }');
    eval('function bors_strlen($str) { return strlen($str); }');
    eval('function bors_substr($str, $start, $length=NULL) { return is_null($length) ? substr($str, $start) : substr($str, $start, $length); }');
    eval('function bors_strpos($str, $need, $start=NULL) { return is_null($start) ? strpos($str, $need) : strpos($str, $need, $start); }');
}
KRoN73 ★★★★★
()
Ответ на: комментарий от NiggasLife

>Применил уличную магию

Я бы разобрался с проблемой детально. Не должно быть в программном продукте уличной магии. А то потом где-то боком вылезет однажды :)

KRoN73 ★★★★★
()
Ответ на: комментарий от NiggasLife

>$transliterate=array("а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё" = >"yo","ж"=>"j","з"=>"z","и"=>"i","й"=>"i","к"=>"k","л"=>"l","м"=>"m","н"=>"n"," о "=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t","у"=>"y","ф"=>"f","х"=>"h","ц"=>"c", " ч"=>"ch", "ш"=>"sh","щ"=>"sh","ы"=>"i","э"=>"e","ю"=>"u","я"=>"ya",
"ь"=>"","Ь"=>"","ъ"=>"","Ъ"=>"");

>strtr("ололо",$transliterate)


а в обратную сторону новый массив создашь?

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

Обратная транслитерация задача неоднозначная и в общем виде не решаемая :) Особенно в условиях нечёткого использования правил.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.