encoding.js =========== [](https://travis-ci.org/polygonplanet/encoding.js) Converts character encoding in JavaScript. JavaScript ã§æ–‡å—コード変æ›ã‚’ã—ã¾ã™ ### Installation #### In Browser: ```html <script src="encoding.js"></script> ``` or ```html <script src="encoding.min.js"></script> ``` **Encoding** ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã‚°ãƒãƒ¼ãƒãƒ«ã«å®šç¾©ã•れã¾ã™ é…列ã«å¯¾ã—ã¦å¤‰æ›ã¾ãŸã¯åˆ¤åˆ¥ã—ã¾ã™ #### In Node.js: `encoding-japanese` ã¨ã„ã†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«åã«ãªã£ã¦ã„ã¾ã™ ```bash npm install encoding-japanese ``` ```javascript var encoding = require('encoding-japanese'); ``` encoding.js ã®å„メソッド㯠Node.js ã® Buffer ã«å¯¾ã—ã¦ã‚‚使ãˆã¾ã™ #### bower: ```bash bower install encoding-japanese ``` #### CDN [cdnjs.com](https://cdnjs.com/libraries/encoding-japanese) ã§CDNãŒåˆ©ç”¨ã§ãã¾ã™ã€‚ #### æ–‡å—ã‚³ãƒ¼ãƒ‰å¤‰æ› (convert): * {_Array.<number>|string_} Encoding.**convert** ( data, to\_encoding [, from\_encoding ] ) æ–‡å—コードを変æ›ã—ã¾ã™ @param {_Array.<number>|TypedArray|Buffer|string_} _data_ 対象ã®ãƒ‡ãƒ¼ã‚¿ @param {_(string|Object)_} _to\_encoding_ 変æ›å…ˆã®æ–‡å—コード @param {_(string|Array.<string>)=_} [_from\_encoding_] 変æ›å…ƒã®æ–‡å—コード or 'AUTO' @return {_Array|string_} 変æ›ã—ãŸé…列ã¾ãŸã¯(æ–‡å—列を渡ã—ãŸå ´åˆ)æ–‡å—列ãŒè¿”りã¾ã™ ```javascript // UTF-8ã®ãƒ‡ãƒ¼ã‚¿ã‚’Shift_JISã«å¤‰æ› var utf8Array = new Uint8Array(...) or [...] or Array(...) or Buffer(...); var sjisArray = Encoding.convert(utf8Array, 'SJIS', 'UTF8'); // 自動判別ã§å¤‰æ› (AUTO detect) var sjisArray = Encoding.convert(utf8Array, 'SJIS'); // or var sjisArray = Encoding.convert(utf8Array, 'SJIS', 'AUTO'); // æ–‡å—コード判別 (戻り値ã¯ä¸‹ã®"Available Encodings"ã®ã„ãšã‚Œã‹) var detected = Encoding.detect(utf8Array); if (detected === 'UTF8') { console.log('Encoding is UTF-8'); } ``` ##### Available Encodings: * '**UTF32**' (detect only) * '**UTF16**' * '**UTF16BE**' * '**UTF16LE**' * '**BINARY**' (detect only) * '**ASCII**' (detect only) * '**JIS**' * '**UTF8**' * '**EUCJP**' * '**SJIS**' * '**UNICODE**' (JavaScript Unicode Array) ※ UNICODE 㯠JavaScript ã® String.charCodeAt() ã®å€¤ã‚’æŒã¤é…列ã§ã™   (é…列ã®å„値㯠256 ã‚’è¶…ãˆã‚‹æ•°å€¤ã«ãªã‚Šå¾—ã¾ã™) ##### 引数㫠Object を指定ã™ã‚‹ ```javascript var sjisArray = Encoding.convert(utf8Array, { to: 'SJIS', // to_encoding from: 'UTF8' // from_encoding }); ``` 第二引数ã«ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã§æ¸¡ã™ã“ã¨ã§å¯èªæ€§ãŒä¸ŠãŒã‚Šã¾ã™ ##### 'type' ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã§æ–‡å—列を指定ã—ã€æ–‡å—列を直接渡㙠```javascript var utf8String = 'ã\u0081\u0093ã\u0082\u0093ã\u0081«ã\u0081¡ã\u0081¯'; var unicodeString = Encoding.convert(utf8String, { to: 'UNICODE', from: 'UTF8', type: 'string' // æ–‡å—列 'string' を指定 (string ã§è¿”りã¾ã™) }); console.log(unicodeString); // ã“ã‚“ã«ã¡ã¯ ``` '*type*' オプションã¯ä»¥ä¸‹ãŒåˆ©ç”¨å¯èƒ½ã§ã™: * '**string**': æ–‡å—列ã¨ã—ã¦è¿”りã¾ã™ * '**arraybuffer**': ArrayBuffer ã¨ã—ã¦è¿”りã¾ã™ * '**array**': Array ã¨ã—ã¦è¿”りã¾ã™ (デフォルト) ##### UTF16 ã« BOM ã‚’ã¤ã‘ã‚‹ UTF16 ã«å¤‰æ›ã™ã‚‹éš›ã« bom オプションを指定ã™ã‚‹ã¨ BOM ãŒä»˜åŠ ã§ãã¾ã™ ```javascript var utf16Array = Encoding.convert(utf8Array, { to: 'UTF16', // to_encoding from: 'UTF8', // from_encoding bom: true // BOMã‚’ã¤ã‘ã‚‹ }); ``` UTF16 ã®ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãƒ¼ã¯ãƒ‡ãƒ•ォルト㧠big-endian ã«ãªã‚Šã¾ã™ little-endian ã¨ã—ã¦å¤‰æ›ã—ãŸã„å ´åˆã¯ bom オプション㫠'LE' を指定ã—ã¾ã™ ```javascript var utf16leArray = Encoding.convert(utf8Array, { to: 'UTF16', // to_encoding from: 'UTF8', // from_encoding bom: 'LE' // BOM (little-endian) ã‚’ã¤ã‘ã‚‹ }); ``` BOM ãŒä¸è¦ãªå ´åˆã¯ UTF16LE ã¾ãŸã¯ UTF16BE を使用ã—ã¾ã™ ```javascript var utf16beArray = Encoding.convert(utf8Array, { to: 'UTF16BE', from: 'UTF8' }); ``` ※ UTF16, UTF16BE, UTF16LE ã¯ã€JavaScript ã®å†…部コードã§ã¯ãªãå„ãƒã‚¤ãƒˆã‚’æŒã¤é…列ã§ã™ #### æ–‡å—コード検出 (detect): * {_string|boolean_} Encoding.**detect** ( data [, encodings ] ) æ–‡å—コードを検出ã—ã¾ã™ @param {_Array.<number>|TypedArray|string_} _data_ 対象ã®ãƒ‡ãƒ¼ã‚¿ @param {_(string|Array.<string>)_} [_encodings_] æ¤œå‡ºã‚’çµžã‚Šè¾¼ã‚€éš›ã®æ–‡å—コード @return {_string|boolean_} 検出ã•ã‚ŒãŸæ–‡å—コードã€ã¾ãŸã¯ false ãŒè¿”りã¾ã™ ```javascript // 自動判別 (AUTO detect) var detected = Encoding.detect(utf8Array); if (detected === 'UTF8') { console.log('Encoding is UTF-8'); } // æ–‡å—コード指定判別 var isSJIS = Encoding.detect(sjisArray, 'SJIS'); if (isSJIS) { console.log('Encoding is SJIS'); } ``` ##### URL Encode/Decode: * {_string_} Encoding.**urlEncode** ( data ) URL(percent) エンコードã—ã¾ã™ @param {_Array.<number>_|_TypedArray_} _data_ 対象ã®ãƒ‡ãƒ¼ã‚¿ @return {_string_} エンコードã•ã‚ŒãŸæ–‡å—列ãŒè¿”りã¾ã™ * {_Array.<number>_} Encoding.**urlDecode** ( string ) URL(percent) デコードã—ã¾ã™ @param {_string_} _string_ å¯¾è±¡ã®æ–‡å—列 @return {_Array.<number>_} デコードã•ã‚ŒãŸæ–‡å—コードé…列ãŒè¿”りã¾ã™ ```javascript // æ–‡å—コードã®é…列を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 // ] ``` ##### Base64 Encode/Decode: * {_string_} Encoding.**base64Encode** ( data ) Base64エンコードã—ã¾ã™ @param {_Array.<number>_|_TypedArray_} _data_ 対象ã®ãƒ‡ãƒ¼ã‚¿ @return {_string_} Base64エンコードã•ã‚ŒãŸæ–‡å—列ãŒè¿”りã¾ã™ * {_Array.<number>_} Encoding.**base64Decode** ( string ) Base64デコードã—ã¾ã™ @param {_string_} _string_ 対象ã®ãƒ‡ãƒ¼ã‚¿ @return {_Array.<number>_} Base64デコードã•ã‚ŒãŸæ–‡å—コードé…列ãŒè¿”りã¾ã™ ```javascript var sjisArray = [ 130, 177, 130, 241, 130, 201, 130, 191, 130, 205 ]; var encoded = Encoding.base64Encode(sjisArray); console.log(encoded); // 'grGC8YLJgr+CzQ==' var decoded = Encoding.base64Decode(encoded); console.log(decoded); // [130, 177, 130, 241, 130, 201, 130, 191, 130, 205] ``` #### Example: ##### XMLHttpRequest 㨠Typed arrays (Uint8Array) を使用ã—ãŸä¾‹: ã“ã®ã‚µãƒ³ãƒ—ルã§ã¯ Shift_JIS ã§æ›¸ã‹ã‚ŒãŸãƒ†ã‚ストファイルをãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ã¨ã—ã¦èªã¿è¾¼ã¿ã€Encoding.convert ã«ã‚ˆã£ã¦ Unicode ã«å¤‰æ›ã—ã¦è¡¨ç¤ºã—ã¾ã™ ```javascript var req = new XMLHttpRequest(); req.open('GET', '/my-shift_jis.txt', true); req.responseType = 'arraybuffer'; req.onload = function (event) { var buffer = req.response; if (buffer) { // Shift_JIS Array var sjisArray = new Uint8Array(buffer); // Convert encoding to UNICODE (JavaScript Unicode Array). var unicodeArray = Encoding.convert(sjisArray, { to: 'UNICODE', from: 'SJIS' }); // Join to string. var unicodeString = Encoding.codeToString(unicodeArray); console.log(unicodeString); } }; req.send(null); ``` ##### File API を使用ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®æ–‡å—コード検出・変æ›ä¾‹: File API を使用ã—ã¦ãƒ•ァイルをèªã¿è¾¼ã¿ã¾ã™ã€‚ ãã®éš›ã«ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–‡å—コードを検出ã—ã€æ£ã—ã表示ã•れるよã†Unicodeã«å¤‰æ›ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚ ```html <input type="file" id="file"> <div id="encoding"></div> <textarea id="result" rows="5" cols="80"></textarea> <script> function onFileSelect(event) { var file = event.target.files[0]; var reader = new FileReader(); reader.onload = function(e) { var codes = new Uint8Array(e.target.result); var encoding = Encoding.detect(codes); document.getElementById('encoding').textContent = encoding; // Convert encoding to unicode var unicodeString = Encoding.convert(codes, { to: 'unicode', from: encoding, type: 'string' }); document.getElementById('result').value = unicodeString; }; reader.readAsArrayBuffer(file); } document.getElementById('file').addEventListener('change', onFileSelect, false); </script> ``` [**ã“ã®ä¾‹ã®ãƒ‡ãƒ¢**](http://polygonplanet.github.io/encoding.js/tests/detect-file-encoding.html) ##### æ–‡å—コード変æ›ä¾‹: ```javascript var eucjpArray = [ 164, 179, 164, 243, 164, 203, 164, 193, 164, 207, 161, 162, 164, 219, 164, 178, 161, 249, 164, 212, 164, 232 ]; var utf8Array = Encoding.convert(eucjpArray, { to: 'UTF8', from: '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 // ] // => 'ã“ã‚“ã«ã¡ã¯ã€ã»ã’☆ã´ã‚ˆ' ``` ##### æ–‡å—コード自動検出ã§ã®å¤‰æ›ä¾‹ (Auto detect): ```javascript 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 unicodeArray = Encoding.convert(sjisArray, { to: 'UNICODE', from: 'AUTO' }); // codeToStringã¯æ–‡å—コードé…列を文å—列ã«å¤‰æ›(連çµ)ã—ã¦è¿”ã—ã¾ã™ console.log( Encoding.codeToString(unicodeArray) ); // output: 'ã“ã‚“ã«ã¡ã¯ã€ã»ã’☆ã´ã‚ˆ' ``` ### Utilities * {_string_} Encoding.**codeToString** ( {_Array.<number>_|_TypedArray_} data ) æ–‡å—コードé…列を文å—列ã«å¤‰æ›(連çµ)ã—ã¦è¿”ã—ã¾ã™ * {_Array.<number>_} Encoding.**stringToCode** ( {_string_} string ) æ–‡å—列を文å—コードé…列ã«åˆ†å‰²ã—ã¦è¿”ã—ã¾ã™ #### 全角/åŠè§’å¤‰æ› ä»¥ä¸‹ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ Unicode æ–‡å—ã¾ãŸã¯ Unicode æ–‡å—コードé…列ã«å¯¾ã—ã¦ä½¿ç”¨ã§ãã¾ã™ * {_Array.<number>|string_} Encoding.**toHankakuCase** ( {_Array.<number>|string_} data ) å…¨è§’è‹±æ•°è¨˜å·æ–‡å—ã‚’åŠè§’è‹±æ•°è¨˜å·æ–‡å—ã«å¤‰æ› * {_Array.<number>|string_} Encoding.**toZenkakuCase** ( {_Array.<number>|string_} data ) åŠè§’è‹±æ•°è¨˜å·æ–‡å—ã‚’å…¨è§’è‹±æ•°è¨˜å·æ–‡å—ã«å¤‰æ› * {_Array.<number>|string_} Encoding.**toHiraganaCase** ( {_Array.<number>|string_} data ) 全角カタカナを全角ã²ã‚‰ãŒãªã«å¤‰æ› * {_Array.<number>|string_} Encoding.**toKatakanaCase** ( {_Array.<number>|string_} data ) 全角ã²ã‚‰ãŒãªã‚’全角カタカナã«å¤‰æ› * {_Array.<number>|string_} Encoding.**toHankanaCase** ( {_Array.<number>|string_} data ) 全角カタカナをåŠè§’カタカナã«å¤‰æ› * {_Array.<number>|string_} Encoding.**toZenkanaCase** ( {_Array.<number>|string_} data ) åŠè§’カタカナを全角カタカナã«å¤‰æ› * {_Array.<number>|string_} Encoding.**toHankakuSpace** ({_Array.<number>|string_} data ) 全角スペース(U+3000)ã‚’åŠè§’スペース(U+0020)ã«å¤‰æ› * {_Array.<number>|string_} Encoding.**toZenkakuSpace** ( {_Array.<number>|string_} data ) åŠè§’スペース(U+0020)を全角スペース(U+3000)ã«å¤‰æ› ### Demo * [æ–‡å—コード変æ›ãƒ†ã‚¹ãƒˆ(Demo)](http://polygonplanet.github.io/encoding.js/tests/encoding-test.html) * [ファイルã‹ã‚‰æ–‡å—ã‚³ãƒ¼ãƒ‰ã®æ¤œå‡ºãƒ»å¤‰æ›(Demo)](http://polygonplanet.github.io/encoding.js/tests/detect-file-encoding.html) ### 貢献 pull request ã¾ãŸã¯ issues ã‚’æ“迎ã—ã¾ã™ã€‚ pull request ã®éš›ã¯ã€ `npm run test` を実行ã—ã¦ã‚¨ãƒ©ãƒ¼ãŒãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 ### License MIT