Skip to content
Latchkey

UTF-8とは? Unicodeテキストエンコーディングの解説

UTF-8は、すべてのUnicode文字を1〜4バイトで表現しつつ、素のASCIIと互換性を保つ、支配的なテキストエンコーディングです。

UTF-8は、現代のほぼすべてのテキストが保存・伝送される方法です。あらゆる言語のあらゆる文字に加えて絵文字を表現でき、一方で素の英語をASCIIと同じように符号化します。CIでエンコーディングを正しくすることが重要なのは、誤ったエンコーディングで読み込まれたファイルが、文字化けを生んだり、buildのステップを完全にクラッシュさせたりするからです。

UTF-8とは

UTF-8はUnicodeの可変長エンコーディングです。一般的なASCII文字は1バイトを使い、他の文字は2、3、または4バイトを使います。つまり、有効なASCIIファイルはすべてすでに有効なUTF-8であり、これが導入を苦もないものにし、UTF-8が勝った大きな理由となっています。

Unicodeとエンコーディング

Unicodeは、すべての文字に番号(コードポイント)を割り当てるカタログです。UTF-8のようなエンコーディングは、その番号を実際のバイトに変えるスキームです。同じ文字を異なる方法で符号化することもできます。UTF-8は、それを行うために最も広く使われているスキームというだけです。

UTF-8がデフォルトになった理由

UTF-8はASCIIと後方互換で、西欧テキストに対してコンパクトで、あらゆるものを表現できます。webはそれに標準化し、今やほとんどの言語やツールがそれをデフォルトにしています。2つのシステムがエンコーディングで食い違うとき、両方がUTF-8を使えばバグはたいてい消えます。

CIにおけるエンコーディングの問題

エンコーディングに起因するbuild失敗は、通常localeの不一致にたどり着きます。非UTF-8 localeのrunnerが、アクセント付き文字や絵文字を含むソースファイルを誤って読み、mojibakeやデコードエラーを生じます。jobの環境でUTF-8 localeを強制すれば、buildはマシンをまたいで決定的になります。

Setting a UTF-8 locale in CI
# Force a UTF-8 locale in a CI job
env:
  LANG: C.UTF-8
  LC_ALL: C.UTF-8
steps:
  - run: python build.py

Latchkeyについての注記

LatchkeyのrunnerはデフォルトでUTF-8 localeを備えており、GitHub-hostedのrunnerと一致します。そのため、非ASCII文字を含むソースファイルも、余分なlocaleのやりくりなしに同じようにbuildされます。

重要なポイント

  • UTF-8はすべてのUnicode文字を1〜4バイトで符号化し、ASCIIと完全に互換です。
  • Unicodeは文字に番号を割り当てます。UTF-8はその番号をバイトに変えるスキームです。
  • CIのエンコーディングバグの大半はlocaleの不一致です - UTF-8 localeを強制すれば、buildは決定的になります。

関連ガイド