🦔

JavaScriptでエンコードを学ぶ

2024/05/28に公開

これはなに

今更ながらエンコードってなに??ってなったのでJavaScriptで試しながら学んでみた。
これはその時のメモを備忘録的にまとめたもの。

エンコードとは

データを他の形式へ変換すること。
ポイントは、意味を変えずに形式を変換する点。

参考: エンコードとは

身近なエンコード例

Google 検索で日本語を打ち込んで検索するとエンコードされる。
これは URL はアルファベットのみが許可されおり、日本語を含めることができないからである。
そのため日本語を入れると、アルファベットの組み合わせに変換(URL エンコード)される。

参考: URL エンコードとは

JavaScript でエンコードする

TextEncoder

概要

文字列を UTF-8 形式のバイト配列(Uint8Array)にエンコードするための Web API。

参考: UTF-8 とは

早速使ってみる。

const encoded = new TextEncoder().encode("あ");

console.log(encoded); // 227,129,130

const decoded = new TextDecoder().decode(encoded);

console.log(decoded); // あ

使い所

  • ネットワーク通信:テキストデータをバイナリ形式で送信するため
  • ファイル操作:テキストデータをバイナリファイルとして保存するため
  • 暗号化:テキストデータを暗号化アルゴリズムに入力するため

今回は暗号化の一例として JavaScript で SHA-256 を生成する例を取り上げる。

SHA-256 の生成

SHA-256 を生成するコードは次のように書ける。

参考: SHA-256とは

async function sha256(message: string): Promise<string> {
  const encoder = new TextEncoder();
  const data = encoder.encode(message);

  const hashBuffer = await crypto.subtle.digest("SHA-256", data);

  // Uint8Arrayを使用してバッファをバイト配列に変換
  const hashArray = Array.from(new Uint8Array(hashBuffer));
  const hashHex = hashArray
    .map((b) => b.toString(16).padStart(2, "0"))
    .join("");

  return hashHex;
}

hello を SHA-256 に変換して出力すると次のようになる。

const input = "hello";
sha256(input).then((v) => {
    console.log(v); // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
});

まとめ

ほかにもURIのエンコードをやってくれるencodeURI()ってのもあった。
エンコードについて勉強してると文字コードの話も出てきたのでいつかまとめたい。

Discussion