2015-12-22 12 views
15

Próbuję podzielić ciąg na pojedyncze słowa/znaki, ale mam problemy z emoji.Dzielenie emoji, bezpiecznie

Przede wszystkim, nie mogę po prostu podzielić ciąg przy użyciu pusty znak ponieważ emotikony są na ogół mają długość> = 2.

"".split("") 
["�", "�"] 

znalazłem emoji regex że przeważnie działa, ale teraz widzę jakieś dziwne bloki w kolorze ciała. Widzę nawet, że pojawiają się na Twitterze w niektórych przypadkach.

enter image description here

Oto długopis, który ilustruje problem z mięsistych bloków http://codepen.io/positlabs/pen/QyEOEG?editors=011

enter image description here

UPDATE -----------

Próbowanie spliddit , i nadal widzę problem ze znakami odcień skóry. Czy jest jakiś sposób, aby skleić je z powrotem?

http://codepen.io/positlabs/pen/rxLqwL?editors=001

Odpowiedz

11

ciągi obsługa JavaScript są UTF-16, więc emotikonów jest wewnętrznie reprezentowane jako dwie jednostki Kod:

> "\ud83d\ude0e" === "" 
true 

Funkcja String.prototype.split nie troszczą się o surrogate pairs w UTF-16, więc naiwnie odwraca poszczególne jednostki kodu i rozbija twoje emoji, ponieważ JavaScript nie zapewnia żadnego sposobu na zajęcie się pojedynczymi znakami w łańcuchach.

Nie ma łatwego sposobu radzenia sobie z tym. Potrzebujesz biblioteki takiej jak spliddit do prawidłowego obsługiwania poszczególnych jednostek kodu.

Nie jestem w 100% zaznajomiony z terminologią, więc w razie potrzeby edytuj moją odpowiedź.

+0

Ok, spliddit jest ładny, ale nadal nie potrafi ponownie połączyć znaków odcieni skóry. Zrobiłem nowe pióro i zaktualizuję moje pytanie. –

+0

@positlabs: Nie mam czasu, aby to sprawdzić teraz, ale jestem prawie pewny, że działa kodek. Spróbuj usunąć wszystkie oprócz flagi i ramion i spróbuj usunąć jedną z nich: http://codepen.io/anon/pen/NxrOoW?editors=001 – Blender

+1

@positlabs: Właściwie to tylko Chrome. Mój powyższy przykład działa zarówno z przeglądarkami Safari, jak i Firefox. Prawdopodobnie błąd. Zobaczę, czy jest jakieś obejście. – Blender

0

spliddit nie może obecnie prawidłowo podzielić na przykład ten tekst hindi na jego 5 znaków: „अनुच्छेद”

Trzeba bibliotekę grafem-polan: https://github.com/orling/grapheme-splitter Jest to pełna realizacja UAX-29 Standard Unicode podzieli nawet najbardziej egzotyczne litery, emoji to tylko jeden z wielu przypadków użycia