LoginSignup
0
2

More than 3 years have passed since last update.

備忘録 Javascript 文字列のカウント(サロゲートペア)

Last updated at Posted at 2020-09-19

知らなかったら、嵌ると思って備忘録として残しておきます。

先に結論としてコードを載せておきます。

var msg = "こんにちは";

console.log(msg.length);
//5

var msg2 = "𩸽";

console.log(msg2.length);
//2

単純に変数msg msg2の文字列を数えていますが、msgの「こんにちは」は5文字としっかりカウントできてます。
しかし、msg2の「𩸽」(ほっけと読みます)は1文字にも関わらず2文字としてカウントされてしまってます。

これは、𩸽という字がサロゲートペアとして扱われているからだそうです!

サロゲートペア

Unicode(UTF-16)は1文字を2バイトで表現していますが、Unicodeで扱う文字列が増えて65535文字では対応できないという事になったので、一部の文字を4バイトで表現する事で文字数を拡張したそうです。


lengthプロパティはサロゲートペアである文字列を識別できないので、4バイトの文字=2文字として文字数をカウントしていたので、msg2の結果が2となっています。

対策

var msg2 = "𩸽";
var num = msg2.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g).length -1;
console.log(num);
// 1
console.log(msg2.length - num);
//1

参考

https://qiita.com/wingsys/items/81d46451d8b93ab065de
https://qiita.com/sounisi5011/items/aa2d747322aad4850fe7
https://jsprimer.net/basic/string-unicode/

0
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2