Правила работы с UTF-8

1. Использовать нормальные IDE и редакторы, способный сохранять в UTF-8 без BOM (Byte Order Mark), например PhpEd и Notepad++

2. В preg_* функциях использовать модификатор u (если в паттерне имеются символо-заменители или русские символы напрямую) Токен \w и т.п. включают ТОЛЬКО латинские символы, поэтому их приходится эмулировать: #[а-яa-z_\d]#ui

3. Директива mbstring.func_overload должна быть прописана на уровне php.ini, поскольку с версии php/5.2.8 не поддерживается на уровне .htaccess
На толковых хостингах перегрузка всегда включается, даже если UTF-8 не является кодировкой по умолчанию. Есть директива mbstring.internal_encoding, которая определяет кодировку системы, и может быть прописана на любом уровне

4. Ф-ии substr(), strtolower(), explode() и др. — успешно перегружаются директивой mbstring.func_overload

5. Ф-ии ucfirst(), ucwords() — не перегружаются, поэтому нуждаются в ручной реализации

Вариант реализации:

static function ucfirst($string)
{
 return strtoupper(substr($string,0,1)).substr($string,1);
}
static function ucwords($string)
{
 return mb_convert_case($string,MB_CASE_TITLE,'utf-8');
}

6. sort() и др. — формально не работают, но на самом деле только кидают букву ё в конец, что может быть не критично для ваших задач

7. Не использовать операторы $str[n] / $str{n}, для строк, содержащих русские символы

8. Учитывать, что preg_match() в флагом PREG_OFFSET_CAPTURE считает байты, а не символы.

9. Для смены кодировок можно юзать mb_convert_encoding() вместо iconv() — на один необходимый модуль меньше

10. Между mbstring.func_overload=2 или mbstring.func_overload=6 нет разницы (включаются бесполезные ereg_* функции) mbstring.func_overload=7 — повреждает email — НЕ использовать

11. PhpMyAdmin будет жаловаться на включение перегрузки и грозиться потерей данных. Как оно на самом деле — неизвестно. Нагуглить не удалось.

Автор: Клешнин Иван