Unicodeと絵文字の正しい反転

Unicode文字、絵文字、結合文字、サロゲートペアを含む文字列を反転する際の課題を理解します。言語間で安全な反転テクニックを学びましょう。

Programming

詳細な説明

Unicode反転の問題

Unicode文字を含む文字列の反転は見た目以上に複雑です。ナイーブな反転アルゴリズムは、視覚的な文字(書記素クラスタ)ではなくコード単位で操作するため、破損した出力を生成する可能性があります。

サロゲートペアの問題

UTF-16(JavaScriptとJavaで内部的に使用)では、基本多言語面(BMP)外の文字(ほとんどの絵文字など)は2つの16ビットコード単位のペアで表現されます。

"😀".length            // 2(2つのコード単位!)
"😀".split("")         // ["\uD83D", "\uDE00"](分解される)
"😀".split("").reverse().join("") // 破損!

結合文字

一部の文字はベース文字と結合文字から構成されます:

é = e + \u0301(結合アキュートアクセント)

安全な反転テクニック

JavaScript(コードポイントレベル):

const reversed = [...str].reverse().join("");

JavaScript(書記素クラスタレベル):

const segmenter = new Intl.Segmenter("en", { granularity: "grapheme" });
const segments = [...segmenter.segment(str)].map(s => s.segment);
const reversed = segments.reverse().join("");
レベル サロゲートペア 結合文字 複合絵文字
コード単位 不可 不可 不可
コードポイント 不可 不可
書記素クラスタ

ユースケース

Unicode安全な文字列反転の理解は、国際化アプリケーション、テキスト処理ツール、絵文字を含むユーザー生成コンテンツを扱うソフトウェアを構築する開発者にとって重要です。シニアレベルのコーディング面接でも一般的なトピックです。

試してみる — Reverse Text

フルツールを開く