Индийский код 2. Второй аргумент против самописов

Главные вкладки

Аватар пользователя v1adimir@drupal.org v1adimir@drupal.org 17 сентября 2011 в 18:34

В продолжение темы 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 такой баг невозможен. )

Комментарии

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 17 сентября 2011 в 21:14

Из самописного недомодуля:

function unicod ($in_text) {
$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;
}

Аватар пользователя v1adimir@drupal.org v1adimir@drupal.org 17 сентября 2011 в 21:26

"RxB" wrote:
function unicod ($in_text) {...

А почему "unicod", а не "unicode" хотя бы?

"xxandeadxx" wrote:
код из ядра шестого друпала:

Видимо в 5-й (или раньше) версии задолбались отвечать на вопрос "где найти drupal_get_headers()". Вот и сделали.