2016-11-01 6 views
7

Я хочу проверить имя, когда новый пользователь регистрируется на моей странице. Одна из этих проверок заключается в том, что лимит символов не превышает 100.Подсчитать длину символа эмози?

Но так как один единственный эмози, подобный ❤️ (на самом деле это 4 эможи вместе? См. Скриншот), насчитывает более 1 символа. У меня есть проблемы для проверки имя. I хочу, чтобы позволить emoji в названии, потому что в наши дни довольно часто бывает сердце, звезда или что-то подобное там, но я не хочу разрешать имена с более чем 100 символами.

Так что у меня такой вопрос:

  • Как посчитать один смайлик как один символ всех смайликов там (если это вообще возможно)?

PS: Я говорю о php-решении, но я бы тоже принял Javascript, даже если я не предпочитаю его.

Edit: Мой пример смайликов, как представляется, эта строка: \ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69

Пожалуйста, обратите внимание на упомянутый снимок этого вопроса:

The screenshot of this question, please notice the emoji output.

+0

Это PHP предупреждение означает, что вы» re передать массив 'trim' вместо строки. Это ошибка в вашем коде, никаких проблем с PHP, а также не имеет ничего общего с emoji. – deceze

+0

О, ты прав. Я нашел эту ошибку и отредактировал мой вопрос. Благодарю. @deceze – AlexioVay

+0

Для чего это стоит, этот emoji состоит из последовательности из 8 сканирующих значений Unicode: U + 1F469 WOMAN; U + 200D ZERO WIDTH JOINER; U + 2764 HEAVY BLACK HEART; U + FE0F ВАРИАЦИОННЫЙ ВЫБОР-16; U + 200D ZERO WIDTH JOINER; U + 1F48B KISS MARK; U + 200D ZERO WIDTH JOINER; U + 1F469 ЖЕНЩИНА. Некоторые языки программирования будут обрабатывать WOMAN и KISS MARK, как если бы они были по два символа, потому что для этих символов требуются два кодовых блока UTF-16. –

ответ

6

Юникод определяет абстрактные символы как кодовые точки, но то, что позволяет отображать его на экране, является шрифтом. Шрифт представляет собой набор графических форм, называемых глифами, и они являются визуальным представлением кодовой точки или последовательности кодовых точек. Последовательность из одной или нескольких кодовых точек, отображаемых как один графический блок , называется grapheme.

Если вам нужно, чтобы получить длину в графемах единиц (а не персонажи, как mb_strlen будет делать), вы можете использовать grapheme_strlen:

$emoji = "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}"; 
echo $emoji , " : " , strlen($emoji) , "\n"; // 27, count bytes 
echo $emoji , " : " , mb_strlen($emoji) , "\n"; // 8, count characters 
echo $emoji , " : " , grapheme_strlen($emoji) , "\n"; // 1, count grapheme units 

https://3v4l.org/KSSl4

+0

Спасибо! Я просто хотел попросить вас опубликовать это как ответ. Там может быть только проблема, что мой сервер провайдер не установил 'intl', как моя версия xampp также не по умолчанию. Будет ли обходной путь в этом случае «более старыми» функциями? – AlexioVay

+1

попробуйте полифонию symfony, https://github.com/symfony/polyfill-intl-grapheme/blob/master/Grapheme.php – Federkun

4

Как потенциал яваскрипта решения (если вы не против добавления библиотеки), Lodash решил эту проблему в своем модуле toArray.

Например,

_.toArray('12').length; // --> 3 

Или, если вы хотите, чтобы сбить несколько произвольных символов от строки, вы манипулируете и воссоединиться массив, как:

_.toArray("trimToEightGlyphs").splice(0,8).join(''); // --> 'trimToE' 
Смежные вопросы