Zalgoテキストによる文字列長の驚き

JavaScript、Python、その他の言語でZalgoテキストが文字列長計算にどう影響するか、コードポイント、コードユニット、書記素クラスタの違いを発見します。

Technical

詳細な説明

文字列長とZalgoテキスト

Zalgoテキストは視覚的な長さとプログラム的な文字列長の間にギャップを作ります。

JavaScriptの文字列長

const clean = "Hello";
const zalgo = "H\u0300\u0301\u0302e\u0303\u0304l\u0305\u0306l\u0307\u0308o\u0309\u030A";

clean.length;  // 5
zalgo.length;  // 15(基底5 + 結合10)

書記素対応の長さ

「視覚的」な長さを取得するにはIntl.Segmenter APIを使用:

function graphemeLength(str) {
  const segmenter = new Intl.Segmenter('en', { granularity: 'grapheme' });
  return [...segmenter.segment(str)].length;
}
graphemeLength(zalgo);  // 5(同じ視覚的長さ!)

実用的な影響

  1. 文字数制限:ZalgoテキストはSNSの文字数制限を急速に消費
  2. データベース保存:VARCHAR(100)が100個の視覚的Zalgo文字を保持できない場合がある
  3. 入力バリデーションinput.length <= 50のチェックが10文字に見えるZalgoテキストを拒否する可能性
  4. 切り捨て:インデックスNでの単純な切り捨ては書記素クラスタの途中で切断される可能性

ユースケース

Zalgoテキストでの文字列長の動作を理解することは、文字数制限、入力バリデーション、データベーススキーマ、ユーザー生成Unicodeコンテンツを扱うアプリケーションでのテキスト切り捨てを実装する開発者にとって重要です。

試してみる — Zalgo Text Generator

フルツールを開く