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 окажутся нужные (подготовленные) вам данные.