文字コード変換ライブラリを JavaScript で作りました。
文字列ではなく配列 or TypedArray で処理します。
追記
↓動作サンプルを作りました
文字コード変換 動作サンプル
Unicode の変換が可能になりました。
文字コード配列から URLエンコード/デコード が可能になりました。
あと説明とサンプルも少し載せました。。(説明不足でごめんなさい)
こないだの 「
JavaScriptだけでzipファイルの解凍 - Unzipper.js」が
SJIS ファイルとかだと表示で文字化けするので、ついつい。。
動作確認は、zip ファイル解凍のデモページでわかると思います。
zip の中に SJIS や EUC-JP のファイル (ファイル名) がある場合でも
UTF-8 表示で化けなければ問題なしです。
↑のデモページを開いて、デスクトップなどから zip ファイルをドロップすると
解凍して結果のテキストを表示します。
※ JavaScript だけで動いていて、どっかのサーバなどに送信したり保存したりしてません
今回はぜんぶ同期で書いちゃったのですが、
バイナリファイルとかが対象だとちょっと重たくなりがち。。
気が向いたら非同期も可能にしてみたいです。
あと、Unzipper.js と同じレポジトリにしちゃったけど
これもできれば別にしたいところ。
追記→
作りました
使い方:
// <script src="encoding.js"></script>
//
// Encoding というオブジェクトがグローバルに定義されます
// 配列に対して変換または判別します
// 文字コード変換
var utf8Array = new Uint8Array(...) or [...] or Array(...);
var sjisArray = Encoding.convert(utf8Array, 'SJIS', 'UTF8');
// 文字コード自動判別で変換
var sjisArray = Encoding.convert(utf8Array, 'SJIS');
// or
var sjisArray = Encoding.convert(utf8Array, 'SJIS', 'AUTO');
// 文字コード判別 (戻り値は下の「共通の文字コード値」のいずれか)
var encoding = Encoding.detect(utf8Array);
if (encoding === 'UTF8') {
alert('UTF8です');
}
// 特定の文字コードかどうか判別
var isSJIS = Encoding.detect(sjisArray, 'SJIS');
if (isSJIS) {
alert('SJISです');
}
// convert, detect 共通の文字コード値:
// - 'UTF32' (detect only)
// - 'UTF16' (detect only)
// - 'BINARY' (detect only)
// - 'ASCII' (detect only)
// - 'JIS'
// - 'UTF8'
// - 'EUCJP'
// - 'SJIS'
// - 'UNICODE' (JavaScript Unicode String/Array)
//
// ※ (detect only) は Encoding.detect() でのみ有効 (変換はできない)
// ※ 'UNICODE' は JavaScript の Unicode コード値 (0xFF 以上の数値になりえる)
//
サンプル:
// EUCJPの文字コード配列 (中身は 'こんにちは、ほげ☆ぴよ')
var eucjpArray = [
164, 179, 164, 243, 164, 203, 164, 193, 164, 207, 161,
162, 164, 219, 164, 178, 161, 249, 164, 212, 164, 232
];
// UTF-8に変換
var utf8Array = Encoding.convert(eucjpArray, 'UTF8', 'EUCJP');
console.log( utf8Array );
// output: [
// 227, 129, 147, 227, 130, 147, 227, 129, 171,
// 227, 129, 161, 227, 129, 175, 227, 128, 129,
// 227, 129, 187, 227, 129, 146, 226, 152, 134,
// 227, 129, 180, 227, 130, 136
// ]
// => 'こんにちは、ほげ☆ぴよ'
// ---------------------------------------------
// 文字コード自動判別で変換
//
// SJISの文字コード配列 (中身は 'こんにちは、ほげ☆ぴよ')
var sjisArray = [
130, 177, 130, 241, 130, 201, 130, 191, 130, 205, 129,
65, 130, 217, 130, 176, 129, 153, 130, 210, 130, 230
];
// Unicodeに変換
var unicodeArray = Encoding.convert(sjisArray, 'UNICODE', 'AUTO');
// 文字列にして表示
// codeToStringは、文字コード配列を文字列に変換(連結)して返す関数
console.log( Encoding.codeToString(unicodeArray) );
//
// output: 'こんにちは、ほげ☆ぴよ'
//
// ---------------------------------------------
// 文字コードの配列をURLエンコード/デコード
var sjisArray = [
130, 177, 130, 241, 130, 201, 130, 191, 130, 205, 129,
65, 130, 217, 130, 176, 129, 153, 130, 210, 130, 230
];
var encoded = Encoding.urlEncode(sjisArray);
console.log(encoded);
// output:
// '%82%B1%82%F1%82%C9%82%BF%82%CD%81A%82%D9%82%B0%81%99%82%D2%82%E6'
var decoded = Encoding.urlDecode(encoded);
console.log(decoded);
// output: [
// 130, 177, 130, 241, 130, 201, 130, 191, 130, 205, 129,
// 65, 130, 217, 130, 176, 129, 153, 130, 210, 130, 230
// ]
ダウンロード
レポジトリ
その他、なにか問題等あれば
コメントやメールまたは
@polygon_planet まで送っていただけるとうれしいです。