JavaScriptにおける絵文字の長さの奇妙なケース:UTF-8、UTF-16、UTF-32、およびグラフェムクラスタ

2025-08-22

この記事では、さまざまなプログラミング言語における絵文字文字列の長さの矛盾について掘り下げています。例えば、JavaScriptでは「🤦🏼‍♂️」。lengthは7ですが、Pythonでは5、Rustでは17です。これは、言語が文字列のエンコーディング(UTF-16、UTF-8など)と文字単位(Unicodeスカラー値、拡張グラフェムクラスタなど)をどのように処理するかによる違いに由来します。著者は、ネイティブエンコーディングでの長さを記憶しておくことは妥当であると主張していますが、他の長さ(拡張グラフェムクラスタなど)は、不必要なストレージオーバーヘッドと同期の問題を避けるために、必要に応じて計算するべきだと述べています。この記事では、さまざまなエンコーディングスキームの長所と短所を分析し、ストレージと交換におけるUTF-8の利点を強調しています。最後に、公正な長さの割り当ての問題を取り上げ、言語間で情報の密度を公正に測定する簡単な方法がないことを示し、世界人権宣言の翻訳を例に挙げています。