JavaScriptは今日のほとんどのプログラミング言語と同様に、文字列をUnicodeで表現します。JavaScriptの文字列内の各文字は、1つまたは2つの16ビットワードを使用して格納されます。以下のJavaScriptコードは、一部のプログラマーを驚かせるかもしれません。なぜなら、1つの文字が2つの16ビットワードになるからです。

> t="🧰"
'🧰'
> t.length
2
> t[0]
'\ud83e'
> t[1]
'\uddf0'

慣習として、\uddf0は16ビット値の0xDDF0、すなわちU+DDF0としても表記されます。

UTF-16標準は比較的単純です。3種類の値があります。高サロゲート(範囲U+D800からU+DBFF)、低サロゲート(U+DC00からU+DFFF)、およびその他のすべてのコードユニット(U+0000–U+D7FFとU+E000–U+FFFF)です。高サロゲートは常に低サロゲートが続かなければならず、低サロゲートは常に高サロゲートが先行しなければなりません。

規則を破って高サロゲートの後に高サロゲートが続く場合はどうなるでしょうか?その場合、無効な文字列になります。文字列を修正するには、パッチを当てることで対応できます。不正な値を置換文字(\ufffd)に置き換えます。置換文字は疑問符として表示されることもあります。

JavaScriptで壊れた文字列を修正するには、toWellFormedメソッドを呼び出します。

> t = '\uddf0\uddf0'
'\uddf0\uddf0'
> t.toWellFormed()
'��'

その速度はどれくらいでしょうか?

私は小さなベンチマークを作成しました。オンラインでテストして速度を測定できます。数キロバイトまでのさまざまなサイズの壊れた文字列を使用します。Apple M4プロセッサ上で、異なるブラウザでベンチマークを実行します。

ブラウザ 速度
Safari 18.6 1 GiB/s
Firefox 147 3 GiB/s
Chrome 145 15 GiB/s

性能にかなりの幅があります!他のChromiumベースのブラウザ(BraveおよびEdge)の速度は、Chromeとほぼ同じです。

JavaScriptランタイムでもテストしました。

エンジン 速度
Node.js v25.5.0 16 GiB/s
Bun 1.3.9 8.4 GiB/s

通常、BunはNodeより高速ですが、このケースではNodeがBunの2倍の速度でした。

したがって、Chromiumベースのブラウザを使用すれば、JavaScriptで1秒あたり10ギガバイトを超える速度で文字列を修正できます。

Published by

Post navigation