Chrome 111 で isWellFormed メソッドが追加された
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ 文字列中のサロゲートペアが壊れてないか確認できる
◆ 壊れてたら代替文字に置き換えてくれるメソッドもある
◆ 壊れてたら代替文字に置き換えてくれるメソッドもある
Chrome 111 で文字列の isWellFormed メソッドが使えるようになりました
普段はあまり使うシーンはなさそうですが いつか使うことがあるかもと思えるものです
絵文字や制御文字も true です
2 文字分になる 4 バイトの絵文字を 1 文字だけにすると false です
絵文字を含む文字列を単純に文字数で切り取ったときに 分割されて壊れてしまってないかを確認できます
どこからどこまでの範囲の文字が false になるか調べてみました
結果は 55296 ~ 57343 (U+D800 ~ U+DFFF) までの 2048 文字でした
サロゲートペアの範囲ですね
これは isWellFormed で false になるような文字があった場合に U+FFFD (�) に置き換えてくれるものです
壊れてしまってる場合は � に変換したほうが視覚的に見えますし そのまま結合されて意図しない形になることを防げます
壊れたものを無理やり組み合わせると関係ない絵文字が生まれたりしますからね
普段はあまり使うシーンはなさそうですが いつか使うことがあるかもと思えるものです
isWellFormed()
普通の文字列は基本 true です絵文字や制御文字も true です
"abc".isWellFormed()
// true
"あいう".isWellFormed()
// true
"❄".isWellFormed()
// true
"🌌".isWellFormed()
// true
"\u0000".isWellFormed()
// true
"\u0001".isWellFormed()
// true
2 文字分になる 4 バイトの絵文字を 1 文字だけにすると false です
"🌌".length
// 2
"🌌"[0]
// '\uD83C'
"🌌"[0].isWellFormed()
// false
"🌌"[1].isWellFormed()
// false
絵文字を含む文字列を単純に文字数で切り取ったときに 分割されて壊れてしまってないかを確認できます
どこからどこまでの範囲の文字が false になるか調べてみました
Array.from(Array(2 ** 16).keys())
.filter(i => !String.fromCharCode(i).isWellFormed())
結果は 55296 ~ 57343 (U+D800 ~ U+DFFF) までの 2048 文字でした
サロゲートペアの範囲ですね
toWellFormed()
toWellFormed というメソッドも合わせて追加されていますこれは isWellFormed で false になるような文字があった場合に U+FFFD (�) に置き換えてくれるものです
"🌌"[0].toWellFormed()
// '�'
"🌌"[0].toWellFormed().charCodeAt()
// 65533
"🌌"[1].toWellFormed().charCodeAt()
// 65533
壊れてしまってる場合は � に変換したほうが視覚的に見えますし そのまま結合されて意図しない形になることを防げます
壊れたものを無理やり組み合わせると関係ない絵文字が生まれたりしますからね
"🐠"[0] + "🪐"[1]
// '🚐'