UTF8 может быть сложным - особенно с PHP
Все используют (или скоро начнут!) UTF8 в эти дни.
Кажется, иногда есть что-то большее. Предполагается, что эта статья послужит руководством по базовой настройке приложения CakePHP с использованием UTF8 и пойдет дальше к действительно сложным частям, касающимся де-факто стандартной кодировки в наши дни.
UTF8 и PHP
Используйте функции с префиксом mb_, если вы знаете, что работаете со строками, которые могут содержать символы UTF8. Итак, если вы хотите посчитать длину такой строки:
$length = mb_strlen($string);
Если вы просто манипулируете строками, вам не всегда нужно использовать эти более медленные и UTF8-ориентированные функции. Но в условиях лучше использовать именно их.
UTF8 и preg_match()
Теперь это сложный вопрос, особенно если вы не хотите перекомпилировать PHP с включенным флагом PCRE UTF-8 или вообще не знаете об этом. ИМХО это должно быть по умолчанию, но обычно это не так.
В большинстве случаев при работе со строками UTF8 модификаторы /u и p{L} помогают:
preg_match('/^\p{L}[\p{L} _.-]+$/u', $username, $matches)
В других случаях вам может потребоваться добавить (* UTF8) в ваш шаблон.
UTF8 и CakePHP
Установка CakePHP
Основные части описаны в книге, особенно в разделе «Начало работы».
Но в ней есть одна ошибка, кодировка APP - это utf-8, а в файле database.php пишется utf8.
Убедитесь, что вы сохранили все файлы как «UTF8 без BOM» через IDE, как только они начнут содержать символы UTF8. Несоблюдение этого требования приведет к проблемам с выводом.
Я обычно стараюсь избегать этого и использую перевод Locale и в основном английские символы во всех файлах, насколько это возможно.
Примечание. Перед добавлением в файлы любых символов UTF8 эти файлы всегда имеют формат ANSI (без спецификации невозможно различить эти два формата кодирования, поскольку они практически одинаковы). Поэтому независимо от того, как часто вы пытаетесь сохранить их как UTF8, они всегда будут ANSI. В случае, если вы удивляетесь, почему в большинстве сред IDE это происходит автоматически.
Исправление функций PHP
Некоторые функции PHP были обернуты в CakePHP, чтобы преодолеть недостатки, связанные с Unicode.
Например, String::wordWrap() заменяет неисправную функцию wordwrap().
Я также добавил несколько исправлений в свой плагин Tools как класс Utility/Utility:
- pregMatch(): замена с поддержкой Unicode для preg_match()
- pregMatchAll(): замена с поддержкой Unicode для preg_match_all()
- strSplit(): замена с поддержкой Юникода для str_split()
- pregMatchAll(): замена с поддержкой Unicode для preg_match_all()
Но это наверное, еще не все …
Правильная валидация
Удостоверьтесь, что ваша валидация поддерживает Unicode - это, вероятно, одна из самых распространенных ошибок в основном англоязычных разработчиков.
Они могут предположить, что работают просто с использованием strlen() или регулярного выражения [a-z] или тому подобного, не принимая во внимание, что, например, многие нормальные имена/фамилии содержат много специальных символов.
Валидация здесь никогда не должна быть слишком строгой. В противном случае многие люди будут очень расстроены.
Таким образом, в приведенном выше примере мы не должны использовать
preg_match('/^\[a-z][a-z .-]+$/i', $firstName)
а что-то более похожее на
preg_match('/^\p{L}[\p{L} .-]+$/u', $firstName)
Подобную вещь я должен был исправить некоторое время назад, в отношении URL.
И это CakePHP2.5 - текущий мастер - так что эта тема наверняка еще актуальна в некоторых случаях. Все больше и больше с дальнейшей интернационализацией.