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に格納しています。

レアケースですが、こういった問題もあることを頭の片隅に置いといてください。

JavaScript入門