2016-11-01 43 views
7

Sayfamda yeni bir kullanıcı kayıt olduğunda adı doğrulamak istiyorum. Bu kontrollerden biri, karakter sınırının 100'ün üzerinde olmamasıdır.Emojinin karakter uzunluğunu saymak ister misiniz?

Ama ‍❤️‍‍ gibi tek bir emoji (bunlar aslında 4 emoji birlikte? Ekran görüntüsüne bakın) 1 karakterden çok daha fazlasını sayıyorum. isim. Ben adında emoji'ye izin vermek için numaralı telefonu istiyorum; çünkü bu günlerde bir kalp, yıldız ya da benzer bir şey olması oldukça yaygındır, ancak 100'den fazla karakter içeren isimlere izin vermek istemiyorum. (Hatta mümkünse)

  • nasıl orada bütün emoji'yi bir karakter olarak bir emoji saymaya:

    Yani bu soru var?

Not: Ben bir php çözümünden bahsediyorum, ama tercih etmesem de alternatif olarak Javascript'i de kabul ediyorum.

Düzenleme:

The screenshot of this question, please notice the emoji output: \ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69

Bu sorunun sözü ekran görüntüsü dikkat edin: My örnek emojisi bu dize gibi görünüyor.

+0

O Bir diziyi bir dizgi yerine "trim" olarak geçirir. Kodunuzda bir hata, PHP ile ilgili bir sorun yok ve emoji ile ilgisi yok. – deceze

+0

Oh, haklısın. Bu hatayı buldum ve sorumu düzenledim. Teşekkürler. @deceze – AlexioVay

+0

Değeri için, bu emoji bir dizi 8 Unicode skaler değerden oluşur: U + 1F469 WOMAN; U + 200D SIFIR GENİŞLEYİCİ; U + 2764 HEAVY BLACK HEART; U + FE0F VARIATION SELECTOR-16; U + 200D SIFIR GENİŞLEYİCİ; U + 1F48B ÖPÜCÜK İŞARETİ; U + 200D SIFIR GENİŞLEYİCİ; U + 1F469 KADIN. Bazı programlama dilleri, WOMAN ve KISS MARK'ı her biri iki karaktermiş gibi ele alır; çünkü bu karakterler, temsil edilecek iki UTF-16 kod birimi gerektirir. –

cevap

6

Unicode, soyut karakterleri kod noktaları olarak tanımlar, ancak ekranda görüntülemeyi sağlayan yazı tipidir. Yazı tipi glifler olarak adlandırılan grafik şekillerden oluşan bir koleksiyondur ve bunlar bir kod noktasının veya kod noktalarının bir dizisinin görsel temsilidir. tekli grafik birimi olarak görüntülenen bir veya daha fazla kod noktasının bir dizisine grapheme adı verilir. Eğer sesletim birimi cinsinden uzunluğunu almak gerekiyorsa (ve NOT karakterleri mb_strlen yapacağını gibi)

, sen grapheme_strlen kullanabilirsiniz: javascript çözüm potansiyeli olarak

$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

Teşekkürler! Sadece bunu bir cevap olarak göndermeni istemiştim. Sunucu sunucumun xampp sürümümde olduğu gibi 'intl' yüklememesi de varsayılan olarak bulunmadı. Bu durumda "eski" işlevler ile bir çözüm var mı? – AlexioVay

+1

symfony'nin polyfill'ini deneyin, https://github.com/symfony/polyfill-intl-grapheme/blob/master/Grapheme.php – Federkun

4

(eğer Lodash bu problemi toArray modülünde ele aldı.

Örneğin

,

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

Veya, bir dize kapalı birkaç keyfi karakterleri vurmak istiyorsanız, değiştirmek ve benzeri diziyi yeniden katılmak: PHP uyarı 'seni kastediyor

_.toArray("trimToEightGlyphs").splice(0,8).join(''); // --> 'trimToE'