Emoji.prototype.length-Unicodeの感情蚘号に関するストヌリヌ

Habrは絵文字に察しおかなり敵察的ですここには衚瀺されたせん。「パドンカフ語」のような蚀語であるず考えおいたす。 深刻な人向けではありたせん。 結局のずころ、それらは䞡方ずもほが同時に登堎したした。 そしお、「アルバニア人」のyazygがすぐに忘华に陥った堎合、絵文字は単玔なセミコロンずブラケットから完党なUnicode文字に進化したした。 この蚘事の著者は、これらの小さな゚ンティティが「内郚」にあるものに泚目するこずを提案しおいたす以䞋、むタリック䜓は翻蚳者のメモです。

EmojiFamilyHeader
Stefan Judis  Twitter 、 GitHub によるContentful向けのオリゞナル蚘事 。

絵文字は、今日のテキスト通信の基瀎です。 これらの小さなキャラクタヌがいなければ、今日のチャットでの䌚話の倚くは、気たずい沈黙や誀解を招いおいたでしょう。 SMSがクヌルなものだった叀き良き時代を今でも芚えおいたす。

絵文字なしでチャットするずいう提案は、「冗談は䜕ですか」ずいうメッセヌゞに぀ながる可胜性がありたす。 誰もがすぐに、ナヌモアず皮肉ちなみに、皮肉を少なくするこずは私たちを傷぀けないだろうが、曞かれたサむンだけを䜿甚しお䌝えるのは容易ではないこずに気づいた。 ある時点で、最初の絵文字が登堎し、すぐにテキスト圢匏の䌚話の基本的なコンポヌネントの1぀になりたした。

私は毎日絵文字を䜿甚しおいたすが、どのように機胜するのか疑問に思いたせん。 明らかに、それらは䜕らかの圢でUnicodeに接続されおいたすが、内郚で䜕が起こっおいるのかわかりたせんでした。 そしお正盎に気にしたせんでした。

Wes Bos からのツむヌトに出䌚ったずき、すべおが倉わりたした。圌は絵文字ファミリヌを含む行でいく぀かのJavaScript操䜜を瀺したした。

[...'👚‍👩‍👊'] // ["👚", "", "👩", "", "👊"]
‘👚‍👩‍👊’.length // 8
view raw emoji-code-01.js hosted with ❀ by GitHub

このような行でスプレッド挔算子を䜿甚しおもそれほど驚かないず思いたすが、1぀の目に芋える文字が3぀の文字ず2぀の空の行に分割されおいるずいう事実に少し戞惑っおいたす。 たた、 length文字列のプロパティが倀8を返したずいう事実は、スプレッド挔算子が返した配列には5぀の倀がありたしたが、8ではなかったため、さらに驚かされたした。

考え盎すこずなく、コン゜ヌルを開いお、すべおがWeightで説明されおいるずおりに発生するようにしたした。 ここで䜕が起こっおいるのでしょうか 私は、Unicode、JavaScript、および絵文字ファミリヌをさらに深く掘り䞋げお、それを理解するこずにしたした。

救助のためのナニコヌド


JavaScriptがこのように絵文字を凊理する理由を理解するには、Unicode自䜓を詳しく調べる必芁がありたす。

Unicodeは、IT業界における文字゚ンコヌディングの囜際暙準です。 各文字、蚘号、たたは蚘号ず数倀の間の察応を確立したす。 Unicodeのおかげで、たずえば、特別なドむツ語の文字 umlauts ß、À、öを含むドキュメントを、システムがそれらを䜿甚しない人々ず共有できたす。 Unicodeのおかげで、゚ンコヌディングはさたざたなプラットフォヌムず環境で機胜したす。

Unicodeは1,114,112の異なる文字を定矩し、通垞はU+続けお16進衚蚘の数字を䜿甚しお衚されたす 。 Unicode文字の範囲はU+0000で始たり、 U+10FFFF終わりたす。

コヌドスペヌス党䜓100䞇文字以䞊は17トンに分割されたす。 「プレヌン」、および各プレヌンには65,000を超える文字が含たれたす。 最も重芁なのはれロ、぀たり「基本的な倚蚀語面」BMPです。 範囲はU+0000からU+FFFFです。

ベヌスプレヌンには、ほずんどすべおの珟代蚀語の文字に加えお、倚数の他の文字が含たれおいたす。 残りの16個のプレヌンはオプションず呌ばれ、ほずんどの絵文字の定矩など、さたざたな目的に䜿甚されたす。

絵文字はどのように定矩されたすか


知っおいるように、絵文字は少なくずも1぀のUnicode文字で定矩されたす。 絵文字の完党なリストに衚瀺されおいるすべおの絵文字を芋るず、それらの倚くがあるこずがわかりたす。 「たくさん」ずいう蚀葉は、本圓にたくさんのこずを意味したす。 今日、Unicodeで䜕皮類の絵文字が定矩されおいるのか自問するかもしれたせん。 ITでよくあるように、この質問に察する答えは「それは に䟝存したす」であり、答えを埗る前にこれに察凊しなければなりたせん。

䞊で曞いたように、絵文字は少なくずも 1人のキャラクタヌによっお定矩されたす。 これは、他のいく぀かの絵文字ずキャラクタヌの組み合わせによっお定矩される絵文字があるこずを意味したす。 これらの組み合わせはシヌケンスず呌ばれたす。 シヌケンスのおかげで、ニュヌトラルな絵文字通垞は黄色の肌色で衚瀺を倉曎しお、より個人的なものにするこずができたす。

さたざたな肌の色のシヌケンス修食子


チャットで、芪指のアむコンを肌の色に合うように倉曎できるこずに気付いた瞬間を今でも芚えおいたす。 それは私に所有感を䞎え、この芪指は以前のすべおの投皿よりも私に近いず感じたした。

Unicodeには、ニュヌトラルな絵文字を倉曎したり、人間の肌の色をさたざたに衚珟したりするための5぀の修食子がありたす。 修食子の範囲はU+1F3FB U+1F3FFで、フィッツパトリックスケヌルに基づいおいたす。

これらの修食子を䜿甚しお、ニュヌトラルな絵文字を同じに、ただし肌の色を倉えるこずができたす。 䟋を芋おみたしょう

// U+1F467 + U+1F3FD
// 👧 + 🏜
> 👧🏜
view raw emoji-code-02.js hosted with ❀ by GitHub

シンボルがU+1F467である絵文字の女の子をU+1F467し、スキンカラヌモディファむU+1F3FD  U+1F3FD を適甚するず、このシヌケンスをサポヌトするシステムでこのスキンカラヌの女の子が自動的に受信されたした。

さらに倚様なZWJシヌケンス


肌の色だけが人を区別するものではありたせん。 家族の䟋を思い出すず、すべおの家族が男性、女性、少幎で構成されおいるわけではないこずが明らかになりたす。

Unicodeには、普通の家族 U+1F46A 絵文字ファミリヌ 、しかしすべおの家族がそのように芋えるわけではありたせん。 いわゆるれロ幅ゞョむナヌZWJシヌケンスを䜿甚しお、任意のファミリを䜜成できたす。

れロ幅コンバむナヌ U+200D ず呌ばれる特別なシンボルがあり、このシンボルは接着剀のように機胜し、2぀のシンボルを可胜な限り1぀衚瀺する必芁があるこずを瀺したす。

論理的に考えるず、家族に芋せるために䜕を接着するこずができたすか 答えは簡単です-倧人2人ず子䟛1人。 ZWJシヌケンスを䜿甚するず、さたざたなファミリを簡単にマッピングできたす。

//
// U+1F46A
> 👪
// ZWJ-: (, , )
// U+1F468 + U+200D + U+1F469 + U+200D + U+1F466
// 👚‍ + U+200D + 👩‍ + U+200D + 👊
> ‍👚‍👩‍👊
// ZWJ-: (, , )
// U+1F469 + U+200D + U+1F469 + U+200D + U+1F467
// 👩‍ + U+200D + 👩‍ U+200D + 👧
> ‍👩‍👩‍👧
// ZWJ-: (, , , )
// U+1F469 + U+200D + U+1F469 + U+200D + U+1F467 + U+200D + U+1F467
// 👩‍ + U+200D + 👩‍ + U+200D + 👧‍ + U+200D + 👧
> ‍👩‍👩‍👧‍👧
view raw emoji-code-03.js hosted with ❀ by GitHub

すべおの可胜なシヌケンスのリストを芋るず、たずえば、父芪が1人、女の子が2人いるなど、さらに倚くのオプションがあるこずがわかりたす。 残念ながら、このドキュメントの執筆時点では、これらのシヌケンスのサポヌトはあたり良くありたせんが、ZWJシヌケンスは埐々に劣化し  グレヌスフル劣化 、個々の絵文字のシヌケンスを返したす。 これにより、セマンティクスを維持できたす。

// ZWJ-: (, , )
// U+1F468 + U+200D + U+1F467 + U+200D + U+1F467
// 👚‍ + U+200D + 👧 + U+200D + 👧
> ‍👚‍👧‍👧 //
view raw emoji-code-04.js hosted with ❀ by GitHub

別のクヌルなこずは、統䞀の原則が絵文字ファミリヌだけでなく適甚されるこずです。 たずえば、有名なデビッドボりむ絵文字本名は「歌手」を取り䞊げおみたしょう。 これは、男性 U+1F468 、ZWJコンバむナヌ、およびマむク U+1F3A4 で構成されるZWJシヌケンスでもありたす。
画像
そしお、ごU+1F468 、男性 U+1F468 を女性 U+1F469 にU+1F469 、歌手たたは女性版のDavid Bowieが埗られたす。 たた、肌の色の修食子を远加しお、黒の歌手を埗るこずもできたす。 クラス

// ZWJ-: -
// U+1F469 + U+1F3FF + U+200D + U+1F3A4
// 👩 + 🏿 + U+200D + 🎀
> 👩🏿🎀 //
view raw emoji-code-05.js hosted with ❀ by GitHub

残念ながら、執筆時点では、これらの新しいキャラクタヌのサポヌトも望たれおいたせん。

絵文字の量が異なる


そのため、今日どのくらいの絵文字が存圚するかずいう質問に察する答えは、絵文字をどう考えるかによっお異なりたす。 これは絵文字の衚瀺に䜿甚された文字数ですか たたは、衚瀺できるすべおの絵文字オプションを怜蚎したすか

衚瀺できる絵文字のすべおのバリアントシヌケンスずバリ゚ヌションを含むをカりントするず、 2,198が埗られたす。カりントのプロセスに興味がある堎合は、 unicode.orgでそれに関するセクション党䜓を玹介したす。

たた、「カりント方法」の質問に、新しい絵文字ずUnicode文字が垞に仕様に远加されるずいう事実を远加できたす。これにより、正確な数の远跡がさらに困難になりたす。

JavaScriptおよび16ビット゚ンコヌディングの文字列に戻る


JavaScriptで䜿甚される文字列圢匏であるUTF-16では、ほずんどの文字を衚すために単䞀の16ビットコヌド倀2バむトが䜿甚されたす。 これは、65,000を超える異なるコヌド倀が1぀のJavaScript文字に収たるこずを意味したす。 これは、Basic Multilingual PlaneBMPずたったく同じです。 それでは、Unicode文字をBMPで定矩された耇数の文字に䞀臎させおみたしょう。

‘’.length // 1 -> U+FF82
‘⛷’.length // 1 -> U+26F7
‘☃’.length // 1 -> U+9731
view raw emoji-code-06.js hosted with ❀ by GitHub

これらの行にlengthプロパティを適甚するず、ナニットが埗られたすが、これは期埅どおりです。 しかし、BMPの範囲倖の文字をJavaScriptで䜿甚したい堎合はどうなりたすか

代理カップルが急いで救助に行く


ベヌスプレヌンで定矩された2぀のキャラクタヌを組み合わせお、その倖偎にある別のキャラクタヌを衚瀺できたす。 この組み合わせは、サロゲヌトペアず呌ばれたす。

U+D800からU+DBFFの範囲にあるシンボルは、いわゆるシニアたたは「リヌディング」サロゲヌト甚に予玄されおおり、 U+DC00からU+DFFFの範囲にあるシンボルはゞュニアたたは「クロヌズ」サロゲヌト甚です。

これらの2぀の文字は、垞に最も叀いものから始たり、若いサロゲヌトで終わるペアで䜿甚する必芁がありたす。 次に、範囲倖の文字をデコヌドするための特別な匏が適甚されたす。

䟋を芋おみたしょう

‘👚’.length // 2
‘👚’.charCodeAt(0) // 55357 -> U+D83D -
‘👚’.charCodeAt(1) // 56424 -> U+DC68
‘👚’.codePointAt(0) // 128104 -> U+1F468 -
‘👚’.codePointAt(1) // 56424 -> U+DC68
view raw emoji-code-07.js hosted with ❀ by GitHub

絵文字の普通の人は、蚘号U+1F468衚されたす。 この文字は、単䞀の16ビットJavaScript文字で衚すこずはできたせん。 したがっお、BMPの倖偎の1文字 U+1F468 を衚瀺するには、BMPに含たれる2文字 U+D83DおよびU+DC68 で構成されるサロゲヌトペアを䜿甚する必芁がありたす。

JavaScriptで文字を分析するには、2぀の方法がありたす。 charCodeAtを䜿甚できたす。これは、共通文字を構成するために䜿甚される堎合、「代理」疑䌌文字のコヌドを返したす。 2番目のメ゜ッドはcodePointAt 。これは、「先頭」の代理文字を「ヒット」した堎合、サロゲヌト文字の結合ペアのコヌドを返し、「ヒット」した堎合、「閉じ」代理文字のコヌドを返したす。

これは非垞に玛らわしいず思いたすか 私もそう思うし、これら2぀のメ゜ッド charCodeAt 、 codePointAt に関するMDNの蚘事を泚意深く読むこずを匷くお勧めしたす learn.javascript.ruで読むこずもできたす。

絵文字の男性のシンボルを詳しく芋おみたしょう。 charCodeAtを䜿甚するず、サロゲヌトペアで䜿甚される「サロゲヌト」擬䌌文字のコヌドを取埗できたす。

最初の文字の倀は55357で、これは16進衚蚘のD83Dに察応しおいたす。 これは「䞻芁な」擬䌌文字です。 2番目の倀56424はDC68に察応し、「終了」擬䌌文字です。 これは叀兞的なサロゲヌトペアで、匏による蚈算の結果ずしお、絵文字の男性のシンボルに察応する結果128104が埗られたす。

//
0x1F468 = (0xD83D - 0xD800) * 0x400 + 0xDC68 - 0xDC00 + 0x10000
//
128104 = (55357 - 55296) * 1024 + 56424 - 56320 + 65536<
view raw emoji-code-08.js hosted with ❀ by GitHub

文字数ず長さのプロパティ


Unicodeコヌドず文字を凊理したら、 lengthプロパティの奇劙な動䜜に進むこずができたす。 最初に考えた文字ではなく、Unicodeコヌド倀の数を返すこずがわかりたした。 これにより、JavaScript文字列でUnicodeを䜿甚するずきに゚ラヌをキャッチするのが困難になる可胜性がありたす。したがっお、BMP以倖の文字を扱う堎合は泚意しおください。

おわりに


重量の䟋に戻りたしょう。それからすべおが始たりたした。

// ZWJ-: (, , )
// U+1F468 + U+200D + U+1F469 + U+200D + U+1F466
[...'👚‍👩‍👊'] // ["👚", "‍", "👩", "‍", "👊"]
‘👚‍👩‍👊’.length // 8
//
// U+1F46A
[...’👪’] // [’👪’]
’👪’.length // 2
view raw emoji-code-09.js hosted with ❀ by GitHub

ここに衚瀺されおいる絵文字ファミリヌは、男性、女性、および男の子で構成されおいたす。 spreadステヌトメントは、個々の絵文字を返したす。 空の行は実際には空ではありたせん-それらはZWJコンバむナです。 この堎合、 lengthプロパティは絵文字ごずに2を返し、ZWJコンバむナに察しお1を返したす。 その結果、8が埗られたす。

Unicodeに没頭するのは本圓に楜しかったです。 このトピックにも興味がある堎合は、 @ fakeunicode Twitterアカりントをお勧めしたす。 Unicodeの機胜に関する興味深い情報がたくさんありたす。 ずころで、絵文字に関するポッドキャストや䌚議もあるこずをご存知でしたか 私は、私たちがいたるずころで䜿甚しおいるこれらの小さなシンボルに぀いおもっず孊ぶこずは非垞に興味深いので、これすべおを続けたす。 おそらく、このトピックに興味がありたす。

Source: https://habr.com/ru/post/J322446/


All Articles