В продолжение темы http://www.drupal.ru/node/68559
Краткое содержание предыдущего поста – занялся поддержкой сайта на самописной CMS. Не могу сдержаться, чтобы не выложить наиболее очаровательные решения. Осубую пикантность задаче придает тот факт, что изначально CMS была разработана под cp1251, а в последнем проекте, уже после сдачи и запуска ее стали переводит на UTF-8.
Вот реализация функции toLower (toUpper() такая же точно)
<?php
function toLower($content) {
$content = strtr($content, "АБВГДЕЁЖЗИЙКЛМНОРПСТУФХЦЧШЩЪЬЫЭЮЯ", "абвгдеёжзийклмнорпстуфхцчшщъьыэюя");
return strtolower($content);
}
?>
Казалось бы малость смешно, но все правильно? Болт там! strtr() работает побайтово и пока этот файл был в cp1251, оно работало. Но после конвертации в UTF-8, естественно, начались чудеса. Фамилия "Агарков" превращается в "ѰѳѰрѺѾѲ".
Отсюда простой вывод – в Друпале, Юмле, Джанге... подобный баг наши бы и поправили мнгновенно, в самописной CMS работать тестором приходится исключительно разработчику данной CMS или тем лохах ответственным разработчикам, которым доверили поддержку проекта. ))
p.s. только не надо гнать в комментариях, что в django такой баг невозможен. )
Комментарии
Да джумла форевер!
код из ядра шестого друпала:
return drupal_set_header();
}
Из самописного недомодуля:
$rus = "АВЕЗКМНОРСТХаеорсух";
$eng = "ABE3KMHOPCTXaeopcyx";
$output="";
$other[1025]="Ё";
$other[1105]="ё";
$other[1028]="Є";
$other[1108]="є";
$other[1030]="I";
$other[1110]="i";
$other[1031]="Ї";
$other[1111]="ї";
$l = strlen($rus);
for ($i=0; $i<strlen($in_text); $i++){
$rep=0;
$c = substr($in_text,$i,1);
for($j=0;$j<$l;$j++) {
if($c == substr($rus,$j,1)) {
$output .= substr($eng,$j,1);
$rep=1;
break;
}
}
if(!$rep) {
if (ord($c)>191){
$output.="&#".(ord($c)+848).";";
} else {
if (array_search($c, $other)===false){
$output.=$c;
} else {
$output.="&#".array_search($c, $other).";";
}
}
}
}
return $output;
}
А почему "unicod", а не "unicode" хотя бы?
Видимо в 5-й (или раньше) версии задолбались отвечать на вопрос "где найти drupal_get_headers()". Вот и сделали.