Многоязыковая проверка ввода в кодировке UTF-8 - PullRequest
5 голосов
/ 01 декабря 2010

Чтобы проверить правильность введенного пользователем английского имени, я обычно сопоставляю ввод с регулярным выражением, например [A-Za-z]Но как я могу это сделать, если требуется поддержка нескольких языков (например, китайского, японского и т. Д.) С кодировкой utf8?

Ответы [ 3 ]

9 голосов
/ 01 декабря 2010

Вы можете аппроксимировать производное свойство Unicode \p{Alphabetic} довольно кратко с [\pL\pM\p{Nl}], если ваш язык напрямую не поддерживает правильное Alphabetic свойство.

Не используйте Java \p{Alpha}, потому что это только ASCII .

Но тогда вы заметите, что вам не удалось учесть тире (\p{Pd} или DashPunctuation работает, но это не включает большинство дефисов!), апострофы (обычно, но не всегда: U + 27, U + 2BC, U + 2019 или U + FF07), запятая или полная остановка / период.

Возможно, вам лучше включить \p{Pc} ConnectorPunctuation , на всякий случай.

Если у вас есть свойство, производное от Unicode \p{Diacritic}, вам также следует использовать это, потому что оно включает в себя такие вещи, как средняя точка, необходимая для обозначенных буквами L на каталанском языке, и несмещаемые формы диакритических знаков, которые иногда используют люди.

Но тогда вы найдете людей, которые используют порядковые номера в своих именах способами, которые \p{Nl} ( LetterNumber ) не соответствуют, поэтому вы бросаете \p{Nd} ( DecimalNumber * 1032) *) или даже все \pN ( Number ) в миксе.

Затем вы понимаете, что азиатские имена часто требуют правильного написания ZWJ или ZWNJ в своих сценариях, поэтому вам нужно добавить U + 200D и U + 200C к миксу, которые оба \p{Cf} ( Формат ) символов, а также JoinControl единиц.

К тому времени, как вы закончите ищите различные свойства Unicode для различных и многих экзотических символов, которые продолжают появляться - или когда вы думаете, все готово, скорее - вы почти наверняка придете к выводу, что вы справились бы с этим гораздо лучше, если бы просто позволили им использовать любые символы Unicode для своего имени, как они пожелают, как ссылка, которую Тим цитирует . Да, вы получите несколько джокеров, вставляющих такие вещи, как «ʇƨɐ⅂uʇƨɐ⅂ əɯɐuʇƨɹᴉℲ», но это относится только к территории, и вы не можете исключать глупые имена любым разумным способом.

3 голосов
/ 01 декабря 2010

Подумайте, действительно ли вам нужно подтвердить имя пользователя.Возможно, вы должны позволить пользователям называть себя так, как они хотят.

Вы, конечно, никогда не должны использовать [A-Za-z], потому что у некоторых людей есть имена с апострофами или дефисами.Может быть довольно оскорбительно запретить кому-либо использовать свое настоящее имя только потому, что оно не следует вашим произвольным правилам того, как должно выглядеть имя.

0 голосов
/ 01 декабря 2010

В PHP я использую этот неприятный хак:

 setlocale(LC_ALL, 'de_DE');
 preg_match('/^[[:alpha:]]+$/', $name);

Сюда входят «умлауты» (то есть «ä», «ö» и т. П.) И акцентированные гласные (è, í и т. Д.). Но он не подходит для проверки кириллицы (Россия, Болгария, ...) или китайских иероглифов ...

...