Welcome to php club

Кодировки

Кодировок очень много, скажем, для русского можно назвать 3 наиболее распространенных: DOS (866), windows-1251, KOI8-R. Такая же ситуация, возможно, справедлива и для других языков, поэтому здесь необходима некоторая стандартизация. Я рекомендую хранить все языковые материалы в кодировке UNICODE, а именно – в UTF-8.


Необходимо помнить, что когда мы говорим о разнообразии языков, мы не считаем английский и все языки, чей символьный диапазон попадает под кодировку latin1. Дело в том, что latin1 часть присутствует во всех кодировках и есть всегда, а, следовательно, смысла считать ее отдельным языком нет. Пример, русская кодировка windows-1251 содержит в себе и латинские символы, при этом никаких перекодировок делать не надо.


Перевести контент из любой кодировки в UTF-8 можно следующим образом:


<?php
$string
= iconv(BROWSER_CHARSET, 'UTF-8', $string);
?>


Здесь константа BROWSER_CHARSET содержит название кодировки, из которой вы перекодируете, например, Windows-1251. UTF-8 – указывает в какой кодировке мы хотим получить результат, а переменная $string содержит контент, который мы переводим из одной кодировки в другую.


Если поменять первый и второй аргумент местами, получите обратный результат.


Iconv – это расширение PHP, проверьте, установлено ли оно у вас. Если вы работаете со статическим контентом при помощи Get Text?, iconv у вас установлен. Если нет – то обратитесь к FAQ по PHP и GetText, там описана установка iconv. На большинстве встреченных мною хостинговых площадках эта утилита установлена, так что никаких проблем у вас не будет.


Все это хорошо, но применять такую конструкцию каждый раз по ходу скрипта несколько утомительно и неэффективно, давайте напишем 2 функции, которые будут проделывать эту процедуру.


<?php
define
('BASE_CHARSET', 'UTF-8');

$GLOBALS['site_languages'] = array(
'en' => array('English', 'UTF-8', 'en_US'),
'ru' => array('Russian', 'UTF-8', 'ru_RU')
);

function
StringToBase($lang, $string) {
    if (
BASE_CHARSET <> $GLOBALS['site_languages'][$lang][1]) {
        
$string = iconv($GLOBALS['site_languages'][$lang][1], BASE_CHARSET, $string);
    }
    return
$string;
}

function
StringFromBase($lang, $string) {
    if (
BASE_CHARSET <> $GLOBALS['site_languages'][$lang][1]) {
        
$string = iconv(BASE_CHARSET, $GLOBALS['site_languages'][$lang][1], $string);
    }
    return
$string;
}
?>


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


Помимо функций я привел еще одну константу и массив. Для чего они нам нужны?


Константа BASE_CHARSET задает кодировку, в которой мы будем хранить информацию в базе (в нашем примере – UTF-8).


Массив $GLOBALS['site_languages'] содержит в себе данные по каждому языку: 'ключ' – двухбуквенное сочетание каждого языка (для его идентификации), его мы будем использовать везде, где необходимо обозначить язык данных; и значения: [0] – полное название языка, [1] – кодировка, в которой информация будет выводиться в браузер и [2] – идентификатор языка для утилиты Get Text?.


Эти данные будут нужны нам постоянно, потому мы их оформили так, чтобы они были доступны в каждой функции и во всех классах нашего приложения.


Теперь давайте посмотрим, что делают непосредственно наши две функции.


При вызове каждой из функций в качестве параметра мы передаем КЛЮЧ – двухбуквенное сочетание для языка, на котором написан текст в $string. Второй параметр – это текстовая строка на языке, обозначенном в $lang.


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


<?php
$string
= StringToBase('ru', $string);

$string = StringFromBase('ru', $string);
?>


И в том и в другом случае в переменной $string окажутся нужные (подготовленные) вам данные.


 
Комментариев нет. [Показать комментарии/форму]