Iconv

Материал из PhpWiki.

Перейти к: навигация, поиск

iconv – это расширение PHP, проверьте, установлено ли оно у вас. Если вы работаете со статическим контентом при помощи GetText, iconv у вас установлен. Если нет – то обратитесь к статье "Многоязычные приложения. Профессиональная работа", там описана установка iconv. На большинстве встреченных мною хостинговых площадках эта утилита установлена, так что никаких проблем у вас не будет.

Примеры:

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

$string = iconv(BROWSER_CHARSET, 'UTF-8', $string);

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

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

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

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] – идентификатор языка для утилиты GetText.

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

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

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

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

$string = StringToBase('ru', $string);
 
$string = StringFromBase('ru', $string);

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

Реклама