JavaScript: 文字列の長さを取得するlengthプロパティ
文字列の長さを取得する場合はlengthプロパティを使います。
コード例
空文字の場合は0を返します。
var str1 = 'abcde'; var str2 = 'あいうえお'; var str3 = ''; console.log(str1.length); // 5 console.log(str2.length); // 5 console.log(str3.length); // 0
サロゲートペアの問題
レアケースですが、「サロゲートペア」と呼ばれる特殊な文字が含まれる場合は、 lengthプロパティの値が1増えてしまいます。
通常Unicodeでは1文字2Byteで表すのですが、「サロゲートペア」は1文字4Byteで表します。 このためlengthプロパティは2文字として認識します。
例えば、次の「𠮟」や「𩸽」(ホッケ)という文字は「サロゲートペア」と呼ばれる特殊な文字の1つです。
lengthプロパティの値を確認してみます。
console.log('あ'.length); // 1 console.log('叱'.length); // 1 console.log('𠮟'.length); // 2 サロゲートペア console.log('𩸽'.length); // 2 サロゲートペア
2行目'叱'と3行目'𠮟'は紛らわしいですが違う文字です。 「しかる」と入力して変換キーを押すと両方が出てきます。
上のようにサロゲートペアと呼ばれる文字は2文字と認識されます。
サロゲートペアを考慮した文字列長
サロゲートペアを考慮した文字列の長さを取得するには、次のようにロジックを追加する必要があります。
str = '𠮟る𩸽'; // サロゲートペア2つ console.log(str.length); // 5 何もしない場合 // サロゲートペアを考慮 var num = str.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g).length - 1; var len = str.length - num; console.log(len); // 3
最初のconsole.log()が5と表示され、2番目のconsole.log()が3と表示されることが確認できます。
split()の行は、サロゲートペアの文字コードで分割し、サロゲートペアの個数を変数numに格納しています。
レアケースですが、こういった問題もあることを頭の片隅に置いといてください。