ソーシャルメディア市場には、ごくごく短い投稿のための隙間があることに気づきました。 Twitterが280文字の投稿を許可するようになった今、手軽にソーシャルメディアを更新したい人のニーズは満たされていません。 そこで、自分だけのソーシャルメディアネットワークを作ることにします。
製品を際立たせるために、極端な仕様にして、5文字以下の投稿だけを許可します。 5文字を超える投稿は、5文字に切り詰めます。
ユーザーが自分を十分に表現できるように、絵文字やその他のUnicodeを許可します。
課題は、入力された文字列を5文字に切り詰めることです。
デジタルで保存されるテキストは、バイトの並びに変換する必要があります。 文字をバイトに対応付ける方法には、よく使われるものが3つあります。
UTF-8とUTF-16はどちらもUnicodeのエンコーディングなので、次のような幅広い文字を表現できます。
UTF-8とUTF-16はどちらも可変長エンコーディングで、文字によって必要な領域の大きさが異なります。
「a」という文字と「😛」という絵文字を考えてみましょう。 UTF-16では、この文字は2バイトですが、絵文字は4バイトです。
この演習のポイントは、Unicodeのコードユニットではなく、Unicodeの文字(コードポイント)を前提に設計されたAPIを使うことです。
「通常の」UTF-16エンコードされた文字列は、一連の文字として表せます。それぞれの文字は最大16ビットです(UTF-16という名前はここから来ています)。 つまり、2¹⁶(2の16乗)、すなわち65536個の文字が、16ビット、つまり1コードユニットで表せることになります。 この65536個の文字が基本多言語面と呼ばれるものを形成していて、ほとんどの言語でよく使われる文字には十分な大きさです。
ただし、一部の記号は1コードユニットには収まりません。その解決策は、2つのコードユニットで表すことです。 この2つのUTF-16コードユニットは、しばしば_サロゲートペア_とも呼ばれ、1つのコードポイントを形成します。
まとめると、UTF-16エンコーディングについて言うときは、次のようになります。
code unitは、1文字を表す16ビット(またはそれ以下)です。code pointは、1文字を表す1つまたは2つのコードユニットです。さらに混乱を招くことに、_書記素クラスタ_もあります。これは基本的に、1つの視覚的な単位として扱うべきUnicode文字(コードポイント)の並びです。 たとえば、この👨👦のようないくつかの絵文字があります。
組み込みのJavascriptメソッドのほとんどはUTF-16エンコードされた文字列で動作しますが、その動作はUTF-16コードユニットに基づいています。
たとえば、String.prototype.split("")メソッドは文字列をコードユニットで分割します。
一方、String iteratorsはコードポイントで反復します。
Unicode文字列についてもっと詳しく読んだり、例を見つけたりできます。MDNをご覧ください。
Exercismに登録すれば、37個のコンセプト159個の演習、そして本物の人間によるメンタリングとともに、JavaScriptを学んでマスターできます。すべて無料です。