UTF-8 и IsAlpha () в PHP - PullRequest
       13

UTF-8 и IsAlpha () в PHP

2 голосов
/ 07 июня 2009

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

Пользователь должен иногда вводить текст самостоятельно, и здесь я сталкиваюсь с проблемами, потому что приложение должно принимать даже «сложные» языки, такие как китайский и русский. До сих пор я позаботился о вещах, упомянутых в других сообщениях, т.е.

  • звонит mb_internal_encoding( 'UTF-8' )
  • установка правильной кодировки при рендеринге веб-страниц с помощью meta http-equiv=Content-Type content=text/html;charset=UTF-8 (формат адаптирован из-за ограничений переполнения стека)
  • даже контент поступает правильно, потому что mb_detect_encoding() == UTF-8
  • попытался установить setLocale(LC_CTYPE, "UTF-8"), который, кажется, не работает, потому что требует выбора одного языка, который я не могу указать, потому что я должен поддерживать несколько. И все равно не получится, если я вызову его вручную для целей тестирования, то есть с помощью; setLocale(LC_CTYPE,"zh__CN.utf8") - ctype_alpha() по-прежнему не работает для текста на китайском языке

Кажется, что даже явный выбор языка не делает ctype_alpha() полезным.

Отсюда возникает вопрос: как мне проверить алфавитные символы на всех языках?

Единственная идея, которая у меня возникла на данный момент, - это проверять вручную массивы «допустимых» символов - но это выглядит некрасиво, особенно для китайцев.

Как бы вы решили эту проблему?

Ответы [ 4 ]

6 голосов
/ 07 июня 2009

Если вы хотите проверять только действительные буквы Unicode независимо от используемого языка, я предлагаю использовать регулярное выражение (если ваше расширение pcre-regex построено с поддержкой Unicode):

// adjust pattern to your needs
// $input needs to be UTF-8 encoded
if (preg_match('/^\p{L}+$/u', $input)) {
    // OK
} else {
    // not OK
}

\p{L} проверяет наличие символов Юникода со свойством L (etter), которое включает свойства Ll (строчная буква), Lm (буква модификатора), Lo (другая буква), Lt (заглавная буква) и Lu (заглавная буква) - от: Подробности регулярного выражения ).

0 голосов
/ 07 июня 2009

Это скорее проблема кодирования, чем проблема определения языка. Потому что UTF-8 может кодировать любой символ Unicode.

Наилучший подход - использовать UTF-8 во всем проекте: в вашей базе данных, в выходных данных и в качестве ожидаемой кодировки для ввода.

  • Вывод Убедитесь, что вы кодируете свои данные с помощью UTF-8 и объявляете это в заголовке HTTP в поле Content-Type , а не только в самом документе.
  • Ввод Если вы используете формы, объявите ожидаемую кодировку в атрибуте accept-charset .
0 голосов
/ 07 июня 2009

Вы можете использовать языки с

$_SERVER['HTTP_ACCEPT_LANGUAGE']

Содержит что-то вроде

de-de,de;q=0.8,en-us;q=0.5,en;q=0.3

так что вам нужно проанализировать эту строку. Затем вы можете использовать предпочитаемый язык в функции setLocale .

0 голосов
/ 07 июня 2009

Я бы не использовал массив символов. Это было бы невозможно управлять.

То, что я бы посоветовал, это определить язык по умолчанию из IP-адреса и использовать его в качестве локали для запроса. Вы также можете получить его из строки browser-agent в некоторых случаях. Вы можете предоставить пользователю способ переопределения, чтобы, если ваши настройки по умолчанию не верны, они не застряли на чужом сайте. (Например, укажите в форме «язык установлен на английский. Если это не правильно, пожалуйста, измените:». Это не самая хорошая вещь, которую нужно предоставить, но вы не получите никакой рабочей проверки, так как вам НУЖЕН язык / языковой стандарт установлен для того, чтобы иметь разумную альфа-валидацию (на китайском языке это не буква A).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...