Если Вы уже начали свой Web проект, или собираетесь начать программировать Web приложения. И Ваш проект подразумевает русский язык – вам следует сразу для себя решить один вопрос – вопрос кодировки. Очень зловещий и раздражительный в некоторых случаях вопрос. Чем раньше вы задумаетесь о нем – тем лучше.
Кодировка – как способ подачи отображения символов. В таблице ASCII – 255 символов. Но отображаться на различных языках может много больше. Так один и тот же код – может обозначать знак, либо загогулину в зависимости от кодировки. Однозначно определить кодировку нельзя, можно лишь догадаться, что с конкретной кодировкой – отображение идет самым понятным образом.
По этому браузер не всегда правильно показывает кодировку, особенно если она жестко не указана. По этому ворд спрашивает в какой кодировке открыть, если файл не является текстовым, пытаясь распознать в груде байтов японские или китайские иероглифы. В этом состоит основная проблема определения кодировки. Но нас она не будет сильно касаться.
Мы будем использовать для себя либо Windows-1251, либо UTF-8. Почему-то во всех программах по умолчанию стоит Windows-1251, и все продолжают кодировать в ней. А после начинают иногда мучаться. Впрочем, идеальной кодировки не существует. Есть наиболее подходящая под конкретный случай.
Чем UTF-8 отличается от Windows-1251?
Прежде всего – каждый символ – это не 1, а 2 байта. По этому – размер файлов увеличивается практически в 2 раза. Размер передаваемых данных тоже увеличивается. Это плохая сторона медали.
Хорошая сторона - За счет избыточного набора символов – в UTF-8 – 65000 возможных символа. Отличный вариант, если вы делаете многоязыковое приложение, у вас не будет проблем с отображением перевода
Многие браузеры по умолчанию используют кодировку UTF-8. По этому, отправляя данные через AJAX– вам больше не придется конвертировать русские значения переменных на стороне сервера. Если Вы собираетесь в полной мере использовать Аякс в своем приложении – Вам желательно перейти на UTF-8 с самого начала.
PHPхорошо работает с кодировкой Windows-1251. Т.к она состоит из 1 байта и все выполняется легко. Если же вы решите использовать операции с подсчетом символов – они покажут вам честное число байт. По этому – для русских строк в кодировке UTF-8 – используется набор операторов, начинающихся с mb_
В PHP.iniдолжен быть также подуключени и установлен модуль mbstring (multibytestring). Он установлен в 99% хостингов. Просто замените все строковые операторы на mb_...
JSON– также использует по умолчанию кодировку UTF-8. Чтобы правильно передать надпись в другой кодировке – Вам придется сочинять функцию конвертации для массивов. Подробнее об этом - ранее
Практика. Если Вы осознали необходимость смены кодировки
Первым делом, приступая к смене кодировки - Сохраните все файлы проекта.
Вы можете открыть файл в редакторе и при сохранении указать другую кодировку. Если получилось – хорошо. Если нет – давайте попробуем написать скрипт, который делает все за нас автоматически.
Выставите предварительно права на запись к папке.
Вот собственно – сам скрипт. Записал, но не проверял. Должно работать )
<?php
define('FROM_CHARSET','windows-1251');
define('TO_CHARSET','UTF-8');
mass_to_utf8('.'); // путь к основному каталогу. Сейчасуказан- текущий
function mass_to_utf8($folder){
$dir=opendir($folder);
while($file=readdir($dir)){
if ($file == '.' || $file == '..') continue;
if (!in_array(substr($file,-4,4),array('.php','.tpl'))) continue;
$way=$folder.'/'.$file;
if (is_dir($way)){
mass_to_utf8($way);
}elseif (is_file($way)){
// convert
file_put_contents($way,iconv(FROM_CHARSET,TO_CHARSET,file_get_contents($way)));
}
}
}
die 'done';
Незабудьте также сменить кодировку в php файлах в команде headers (если такая была) и в meta тегах основного шаблона, если там была указана кодировка, а также в файле .htaccess, опять же, если там кто-то мог поставить принудительную установку кодировки
Успехов в выборе правильной кодировки и налаживании одного языка со всеми платформами.
Если Вы таки планируете продолжать развивать приложения в вебе и не собираетесь поддерживать старые сайты и при этом используете одну базу общих классов - эти общие классы потянут за собой все остальные файлы, т.к. проект с файлами в разной кодировке будет работать коряво