JavaScriptの文字コード絡みの忘却録

型と文字コード

文字コード 補足
DOMString UTF-16
String UTF-16 DOMString
Blob - DOMStringはUTF-8に変換される
ソースコード - UTF-8BOMなしが一般的

UTF-8/UTF-16への変換

// DOMString(UTF-16) -> DOMString(UTF-8)
var text = "文字列";
var utf8 = unescape(encodeURIComponent(text));

// DOMString(UTF-8) -> DOMString(UTF-16)
var utf16 = decodeURIComponent(escape(utf8))

BASE64への変換

// DOMString(UTF-16) -> DOMString(UTF-8) -> BASE64
var text = "文字列";
var b64 = btoa(unescape(encodeURIComponent(text)));

// BASE64 -> DOMString(UTF-8) -> DOMString(UTF-16)
var str = decodeURIComponent(escape(atob(b64)));

ArrayBufferへの変換

// DOMString(UTF-16) -> DOMString(UTF-8) -> ArrayBuffer(UTF-8)
var text = "文字列";
var utf8 = unescape(encodeURIComponent(text));
var array = Uint8Array.from(utf8.split(''), c => c.charCodeAt(0));

// DOMString(UTF-16) -> ArrayBuffer(UTF-16)
var text = '文字列';
var array = Uint16Array.from(text.split(''), c => c.charCodeAt(0));

Blobへの変換

// DOMString(UTF-16) -> Blob(UTF-8N)
var bom = new Uint8Array([/*0xEF, 0xBB, 0xBF*/]);
var text = '文字列';
var blob = new Blob([bom, text], {"type": "text/plain"});

// DOMString(UTF-16) -> ArrayBuffer(UTF-16) -> Blob(UTF-16LF)
var bom = new Uint8Array([0xFF, 0xFE]);
var text = '文字列';
var array = Uint16Array.from(text.split(''), c => c.charCodeAt(0));
var blob = new Blob([bom, array], {"type": "text/plain"});

4バイト文字の文字列長

var emoji = "😉😉😉"
console.log(emoji.length);            // 6
console.log(Array.from(emoji).length);// 3
console.log([...emoji].length);       // 3

※スプレッド構文:[...iterableObj]

ソースコードの文字コード

Web関連のソースコードの文字コードは、UTF-8BOMなしが一般的。

BOMありだと処理できないシステムがあるため、UTF-8BOMなしなんだとか。(文字化けとかが起こる)

ただし、Microsoft ExcelでCSVファイルを扱う場合は、UTF-8BOMありにしないと、Shift-JIS扱いされて文字化けします。

参考

コメントを書く