SYNCERのロゴ
アイキャッチ画像

String.prototype.normalize() - form形式で正規化する

String.prototype.normalize()は、文字列(Unicode)を正規化するメソッドです。例えば、平仮名の「か(\u304b)」と濁点の「゛(\u3099)」、2つのUnicodeが並んだ場合、一見、1つの文字の「が(\u304c)」として見えますが、実際は1つの文字ではありません。そういったUnicodeを、例えば1つの「が(\u304c)」に統一することでデータを統一するのが、このメソッドの役割です。

概要

名前
normalize
所属
String.prototype
仕様書
https://tc39.github.io/ecma262/#sec-string.prototype.normalize

説明

String.prototype.normalize ( [ form ] )

引数(form)には、正規化の形式を指定する。配列で

NFC
正準等価性により分解、合成される。「か」と「゛」を「が」にする。
NFD
正準等価性により分解される。「が」を「か」と「゛」にする。
NFKC
互換等価性によって分解、合成される。NFCに加えて、「半角カナ→全角カナ」「全角数字→半角数字」など、互換等価が行なわれる。
NFKD
互換等価性によって分解される。NFDに加えて、「半角カナ→全角カナ」「全角数字→半角数字」など、互換等価が行なわれる。

チュートリアル

下記にいくつかの例を示します。

// NFC
var string = "\u304b\u3099" ;
var result = string.normalize( "NFC" ) ;		// 正準等価により、\u304b\u3099 → \u304c

// NFD
var string = "\u304c" ;
var result = string.normalize( "NFD" ) ;	// 正準等価により、\u304c → \u304b\u3099

// NFKC
var string = "\u304b\u3099123" ;
var result = string.normalize( "NFKC" ) ;		// \u304c123
// 正準等価により、\u304b\u3099 → \u304c
// 互換等価により、123 → 123

// NFKD
var string = "\u304c123" ;
var result = string.normalize( "NFKD" ) ;		// \u304b\u3099123
// 正準等価により、\u304c → \u304b\u3099
// 互換等価により、123 → 123

デモ

String.prototype.normalize()のデモです。それぞれ、正規化前と正規化後でUnicodeが変換されているのを確認しましょう。

<!-- このコードは編集できます。 -->

<!DOCTYPE html>
<html>
<head>
	<style>
body {
	white-space: pre-wrap ;
}
	</style>
</head>
<body>
<script>
/** try it! **/
var a = escape( "\u304b\u3099" ) ;
var b = escape( "\u304b\u3099".normalize( "NFC" ) ) ;

var c = escape( "\u304c" ) ;
var d = escape( "\u304c".normalize( "NFD" ) ) ;

var e = escape( "\u304b\u3099123" ) ;
var f = escape( "\u304b\u3099123".normalize( "NFKC" ) ) ;

var g = escape( "\u304c123" ) ;
var h = escape( "\u304c123".normalize( "NFKD" ) ) ;
/** try it! **/

var results = { a:a, b:b, c:c, d:d, e:e, f:f, g:g, h:h, } ;

for( var name in results ) {
	console.log( name, results[name] ) ;
	document.body.appendChild( new Text( name + " = " + JSON.stringify( results[name] ) + "\n" + ( ["b","d","f","h"].indexOf(name)>-1 ? "\n" : "" ) ) ) ;
}
</script>
</body>
</html>

サポート状況

ChromeFirefoxSafariEdgeIEOperaiOS SafariAndroid
34+ 31+ 10+× 21+ 10.0+×
  • Twitterでシェア
  • Facebookでシェア
  • Google+でシェア
  • はてなブックマークでシェア
  • pocketに保存
  • LINEでシェア
更新履歴
2017年9月29日 (金)
コンテンツを公開しました。