【JSリファレンス】String.prototype.normalize()

更新日:2024/06/14

String.prototype.normalize()は、Stringオブジェクト(Stringコンストラクターのインスタンス)プロトタイプチェーンに組み込まれるメソッドです。

Unicode正規化形式に従って、文字列を正規化します。
正規化方法は4つあり、結果が異なります。

 

■構文

String.prototype.normalize ( [ form ] )
  1. form: 省略可能。規定値 "NFC"

    次の3つのうちのどれかを指定

    "NFD":
    正規化形式D。正準分解する

    "NFC":
    正規化形式C。正準分解後に正準合成する

    "NFKD":
    正規化形式KD。互換性分解する

    "NFKC":
    正規化形式KC。互換性分解後に正準合成する

正規化後の文字列

■備考1: 正準分解(Canonical Decomposition)

正準分解は、合成文字として表現可能な文字を合成文字に変換します。

次のコードは同じ文字を比較しているように見えますが、結果がfalseになります。

const text1 = "ぴ";
const text2 = "ぴ";

console.log( text1 === text2 ); // false

各文字のコードを見ると、一方が合成文字であることがわかります。

const toHex = e=>[...e]
  .map(e=>"\\u" + e.codePointAt(0).toString(16).padStart(4,"0"))
  .join("");

console.log( toHex(text1) ); // \u3074
console.log( toHex(text2) ); // \u3072\u309a 合成文字

"NFD"で正準分解を行うと、合成文字に統一されます。

const text3 = text1.normalize("NFD");
const text4 = text2.normalize("NFD");

console.log( toHex(text3) );     // \u3072\u309a
console.log( toHex(text4) );     // \u3072\u309a
console.log( text3 === text4 );  // true

■備考2: 互換性分解(Compatibility Decomposition)

互換性分解は、代替可能な文字がある場合に変換されます。

例えば半角カタカナが全角に、全角アルファベットは半角に変換されます。

console.log( "カカ".normalize("NFKD") );  // カカ (半角⇒全角)
console.log( "aa".normalize("NFKD") );  // aa (全角⇒半角)
console.log( "11".normalize("NFKD") );  // 11 (全角⇒半角)
console.log( "㌔".normalize("NFKD") );   // キロ
console.log( "①".normalize("NFKD") );    // 1

■備考3: 正準合成(Canonical Composition)

可能な限り少ないコードで一文字を表します。
例えば合成文字と同等の単一文字がある場合は、単一文字に置き換えられます。

const toHex = e=>[...e]
  .map(e=>"\\u" + e.codePointAt(0).toString(16).padStart(4,"0"))
  .join("");

  // 単一文字と合成文字の文字列
const text1 = "ぴぴ";
console.log( toHex( text1 ) ); // \u3074\u3072\u309a

  // 単一文字に統一
const text2 = text1.normalize("NFC");
console.log( toHex( text2 ) ); // \u3074\u3074

更新日:2024/06/14

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。