2016-04-22 26 views
6

Normalnie chciałbym po prostu użyć czegoś takiego jak str[i].Jak iterować tylko znaki w ciągu, które widzę?

Ale co, jeśli str = "☀️"?

str[i] kończy się niepowodzeniem. for (x of str) console.log(x) również nie działa. Wydaje on w sumie 4 znaki, mimo że w tekście są wyraźnie tylko 2 emoji.

Jaki jest najlepszy sposób na powtórzenie każdego znaku, który widzę w ciągu znaków (i nowych linii, chyba) i nic więcej?

Idealne rozwiązanie zwróci tablicę złożoną z 2 znaków: 2 emoji i nic więcej. Zgłoszony duplikat i kilka innych znalezionych przeze mnie rozwiązań nie pasują do tego kryterium.

+2

myślę, że należy sprawdzić to na blogu: [link] (https://mathiasbynens.be/ notes/javascript-unicode) – msencer

+2

Możliwy duplikat [Split string JavaScript do tablicy z kodepunktami? (biorąc pod uwagę "pary zastępcze", ale nie "klastrów grafem")] (http://stackoverflow.com/questions/21397316/split-javascript-string-into-array-of-codepoints-taking-into-account-surrogat) –

+0

Chcesz powiedzieć, że chcesz uchwycić emoji, pominąć go i znaleźć następną "normalną" postać? – KevBot

Odpowiedz

0

Musisz stworzyć własne metody dla postaci astralnych.

"foobar".match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|./g); 
// => ["f", "o", "o", "", "b", "a", "r"] 
+0

To nie działa we wszystkich przypadkach. Rozważmy "foob☀️ar" .match (/ [\ uD800- \ uDBFF] [\ uDC00- \ uDFFF] | .g); '. – thedayturns

+0

@thedayturns: Tak, obejmowałem tylko postacie astralne, gdzie JavaScript "omyłkowo" dzieli pojedynczy znak Unicode na dwa znaki JS.Pusty łańcuch zawiera VARIATION SELECTOR 16 (U + FE0F), który jest oddzielnym znakiem Unicode, ale łączy się z poprzednim; podobnym problemem byłyby wszystkie kombinacje znaków, takie jak COMBINING ACUTE ACCENT (U + 0301). Aby rozwiązać * ten * problem, potrzebna jest cała biblioteka, która wykracza poza zakres odpowiedzi StackOverflow. – Amadan