JavaScriptで4バイト文字対応のUTF8変換ライブラリutf8.jsを書いた

久々にJavaScriptライブラリを書いたのをいいことに4ヶ月ぶり2度目のブログ更新です。

utf8.js

文字列とUTF8バイト列の相互変換を可能にするもので、
正直ニッチ過ぎて使用用途の提案もできないですが、なるべくわかりやすく書いたので何らかの参考になれば幸いです。

これを書いた理由はWebSocketでバイナリ形式で通信するラッパーを書いていて、UTF8の4バイト文字をサポートしているライブラリが見つからなかったので勉強がてらに調べつつ書きました。

その際に一番参考になったサイトがこちら
vs UTF-8, UTF-16, UCS4 - 枕を欹てて聴く

ちなみに面倒な事をせずにビルトインのunescape(encodeURIComponent(str))を使うと簡単に書けるのですが、処理内容に無駄があってパフォーマンスが悪いという体で勝手に話を進めさせて頂きます。

Source

コードがちょっと長くなるのでgithubに上がっている最新のものを確認してください。
surrogate pairっていう言葉がコメントに出てくる辺りが見所となっています。

view source on github

簡単に説明をするとUTF8で4バイトで表現される文字がJavaScriptではUTF16形式の2文字のサロゲートペアとして扱われるので文字コードの変換を間に挟んでいます。

例えばこの文字の場合、UTF16の文字コード0xD8400xDC0Bの2文字に分かれているので、131083という文字コードに直してからエンコードを行うという感じです。

console.log('𠀋'.length);// 2
console.log('𠀋'.charCodeAt(0));// 55360 -> 0xD840
console.log('𠀋'.charCodeAt(1));// 56331 -> 0xDC0B
console.log(String.fromCharCode(0xD840, 0xDC0B));// '𠀋'

Sample

関数は変換と復元の2つだけです。

// 文字列からバイト列への変換
var bytes = utf8.stringToBytes('変換させる文字列');
console.log(bytes);

// バイト列から文字列への復元
var str = utf8.bytesToString(bytes);
console.log(str);

使用時の注意としてはページのエンコーディングを必ずUTF8にして使ってください。

以上です。