Waarom de gebruikelijke oneliner emoji vernielt
text.split('').reverse().join('') is overal het eerste antwoord, en het is fout voor alles behalve kale ASCII.
Het hakt tekens doormidden. Een JavaScript-string bestaat uit UTF-16 code-eenheden, en elk teken buiten het basisvlak, en dat is vrijwel elke emoji, is een paar. split('') geeft de helften los terug, dus omdraaien laat losse surrogaten achter die als vervangingsvakjes getekend worden.
Dat repareren is niet genoeg. Omdraaien op codepunt met [...text].reverse().join('') houdt losse emoji heel en breekt alles dat uit meer dan één is opgebouwd. De gezinsemoji wordt drie losse mensen. Een e met een combinerend accent aigu wordt een accent dat voor een kale e zweeft. Een vlag is een paar regionale indicatoren, en die omwisselen geeft een ander land of niets.
De eenheid die je wilt is het grapheme cluster (Unicode Annex #29): de reeks codepunten die een lezer als één teken ziet. Deze tool vindt die met Intl.Segmenter, dus emoji, vlaggen, huidskleurmodifiers, combinerende accenten en clusters uit het Devanagari en het Thai overleven allemaal.
Veelvoorkomende problemen
- Omgedraaid Arabisch of Hebreeuws ziet er door elkaar uit. Dat is ook zo. Die schriften worden van rechts naar links geschreven en de browser regelt dat bij het tekenen al. De opgeslagen volgorde omdraaien vecht tegen het weergavealgoritme in plaats van ermee samen te werken.
- Woordmodus houdt leestekens vast aan het woord. "Hallo, grote wereld" wordt "wereld grote Hallo,". Splitsen op Unicode-woordgrenzen zou de komma losweken en leestekens door het resultaat strooien. De spatiëring blijft staan, dus inspringing en kolomruimte overleven.
- Windows-regeleindes komen als Unix-regeleindes terug. Carriage returns worden eerst genormaliseerd naar line feeds, want een losse CR midden in een regel zou onzichtbare beschadiging zijn.
- De newline aan het eind verplaatste niet. Hem als nog een teken behandelen zou elk omgedraaid bestand een lege eerste regel geven.
Veelgestelde vragen
Krijg ik mijn tekst terug als ik twee keer omdraai?
In de modi Tekens en Regels wel, alleen komt CRLF terug als LF. Woordmodus komt alleen terug bij tekst met enkele spaties, want de spatiëring blijft staan terwijl de woorden verplaatsen.
Kan ik hiermee op een palindroom controleren?
Bij één woord wel. Bij een zin klopt het niet: "A man, a plan, a canal: Panama" is pas een palindroom als spaties, leestekens en hoofdletters weg zijn.
Hoeveel tekst kan ik in één keer omdraaien?
2 MB. De grenzen tussen graphemes vinden is het meeste van de kosten, dus een halve megabyte draait ruim binnen een seconde om. Boven 20.000 tekens wordt de uitvoer een moment nadat je stopt met typen bijgewerkt.
Waarom breken mijn emoji bij het omdraaien in andere tools?
Omdat die code-eenheden omdraaien. Een vlagemoji is twee regionale indicatoren en een gezin is een aantal mensen verbonden door zero-width joiners, dus splitsen op tekens en omdraaien husselt ze door elkaar tot andere emoji of tot niets. Deze pagina draait graphemes om met Intl.Segmenter, en die houdt elk teken heel.