文字コードとは|文字を番号として扱うための決まり

30秒でわかる答え

文字コードは、文字を番号やバイト列に対応させる決まりです。Unicodeは文字と番号の対応などを定め、UTF-8はその番号をバイト列で表します。保存と読み取りの方式が違うと、文字化けの原因になります。

マコト

バイトの箱に入った文字は、どうやって『あ』として読まれるんだろう

ユイ

同じ0と1でも、読む約束がないと文字には見えないんですね

ピコ

その約束を考える入口が文字コードだよ

文字コードとは、文字をコンピューターが扱える番号やバイト列に対応させるための決まりです。

人には「あ」「A」「猫」のような文字として見えていても、コンピューターは文字の形をそのまま覚えているわけではありません。文字ごとに決められた番号や、その番号を保存・送信するためのバイト列として扱います。画面のむこう側では、文字、番号、バイト列、表示するためのフォントが役割を分けて働いています。

第73話「文字コードは何を決める?」では、バイトの箱の上に残った一枚の文字カードを見ます。カードの表には文字、裏には番号札があり、イトたちは「文字として読む約束」をたどります。

TERM PRIMER

先に知っておく言葉

文字コード
文字をコンピューターで扱える番号に対応させるための決まりです。
Unicode
世界中の文字を共通して扱うための大きな文字の番号表です。
UTF-8
日本語を含む多くの文字を扱える、Webでよく使われる文字コードです。
バイト
データ量を表す単位。多くの場合、8ビットを1バイトとして扱います。
文字化け
文字コードの食い違いによって、文字が読めない記号として表示される状態です。

文字コードを先にいうと

ラボのたとえでは、文字カードの裏に番号札が貼られています。「A」にはこの番号、「あ」にはこの番号、というように、文字と番号を対応させます。実際のコンピューターでは、その番号をさらにバイトの並びとして保存したり、通信で送ったりします。

このとき、文字コードは字の形そのものを指定するものではありません。文字コードは「どの文字として読むか」に関係します。画面でどんな形の字に見えるかは、フォントや表示環境も関係します。まずは「どの文字の番号か」と「番号をどう保存するか」を分けて見てみましょう。

UnicodeとUTF-8の関係

Unicodeは、文字と共通の番号の対応などを定める規格です。入口では、大きな文字の番号表と考えるとつかみやすくなります。ひらがな、漢字、アルファベット、記号、絵文字などを扱います。

UTF-8は、そのUnicodeの番号をバイト列として保存・通信するための方式の一つです。Webページやテキストファイル、アプリのデータなどで広く使われています。初心者の入口では、Unicodeは文字の番号表、UTF-8はその番号をバイトの箱に入れる方法、と分けると見通しがよくなります。

実際に「A」と「あ」を比べてみます。下の番号とバイトの値は16進数という書き方です。値を暗記する必要はありません。「番号」と「保存される並び」が別の欄にあることに注目してください。

文字とUnicodeの番号UTF-8のバイト列
A:U+004141(1バイト)
あ:U+3042E3 81 82(3バイト)

U+はUnicodeの番号を示す書き方です。右欄では、空白で区切った二桁が1バイトに当たります。同じ一文字に見えても、「A」と「あ」では保存に使うバイト数が違います。

UTF-8は、一つの符号位置(文字の番号)を1〜4バイトで表します。また、濁点を組み合わせた文字や絵文字などは、複数の番号がまとまって一文字に見えることもあります。「一文字は必ず何バイト」と見た目だけでは決められません。

イトとマコトとピコが、広い文字の表から小さなバイト箱へ情報が入っていく流れを見ている
文字カードからバイト列へ進む模型です。実際の番号・値・バイト数は上の表で確認できます。
言葉入口の見方
Unicode文字に番号を割り当てる大きな表
UTF-8Unicodeの番号をバイト列で表す方式
文字化け別の文字コードで読むなどして、本来とは違う文字や記号になること

このバイト列を受け取った側も、同じ方式で読む必要があります。別の方式で読んだら、同じ文字に戻るでしょうか。

文字化けが起きる理由

文字化けは、文字を保存したときの決まりと、読むときの決まりがずれた場合に起きることがあります。

たとえば、あるファイルがUTF-8として保存されているのに、別の文字コードとして読まれると、同じバイト列が別の文字として解釈される場合があります。先ほどの E3 81 82 も、UTF-8で読めば「あ」に戻ります。別の方式では違う文字や、読み取れなかったことを示す記号になる場合があります。

ユイとピコが、同じバイト箱を違う読み取り台に通すと別のカードが出る様子を確認している
文字化けは、データそのものだけでなく、保存したときと読むときの決まりがずれた場合にも起きます。

古いメールや、別のシステムから受け取ったテキスト・CSVなどで、このずれに出会うことがあります。まず元ファイルを残し、コピーを使って読み込み時の文字コードを確認します。読み方の不一致なら正しく開き直せる場合がありますが、別の記号に置き換えた状態で保存され、元の情報が失われていると、読み方を変えるだけでは戻せません。

イト

文字化けって、文字が壊れたというより、読み方を間違えた場合があるんだね

ピコ

そう。バイトの並びと、それを読む約束の組み合わせで考えるとわかりやすいよ

Webページで文字コードが使われる場面

読む方式をそろえる必要があるなら、Webページではその方式をどう伝えるのでしょうか。

HTMLでは、<meta charset="utf-8"> のような宣言で文字コードを示します。ブラウザはこの宣言や、サーバーから届くHTTPヘッダーなどを手がかりに、バイト列を文字として読みます。

ただし、宣言を書き換えるだけではファイルのバイト列は変換されません。UTF-8として保存したデータなら、宣言やサーバーが伝える文字コードもそれに合わせます。中身と読む方式の指定が食い違うと、文字化けの原因になります。Webページの材料としてHTMLがどう読まれるかは、HTMLとは と合わせて見ると理解しやすくなります。

文字を正しく読めたあとには、その字をどんな形で描くかという仕事が残っています。文字の大きさ、太さ、行間、色、配置は、CSSやフォントも関わる領域です。

文字コードとフォントの違い

文字コードとフォントは混同しやすい言葉です。

文字コードは、どの文字として読むかを決めるための約束です。フォントは、その文字をどんな形で描くかに関係します。同じ「あ」という文字でも、丸い書体、角ばった書体、手書き風の書体があります。文字としては同じでも、見た目が変わるわけです。

見る点文字コードフォント
主な役割文字を番号やバイト列として扱う文字の見た目を描く
関係する場面保存、通信、読み取り、文字化けデザイン、読みやすさ、表示の雰囲気
たとえ文字カードの裏の番号札文字カードの表の描き方

文字が別の文字に化けるなら、文字コードや読み取り条件が関係している場合があります。文字は正しいのに形だけが違うなら、フォントや表示環境の話かもしれません。また、使えるフォントに字形がないと、四角い箱などで表示されることがあります。見た目が乱れたからといって、すぐに文字コードを変えればよいわけではありません。

文字コードが使われる場面と確認場所

文字コードは、次のような場所で確認することがあります。

  • テキストエディタの保存形式やエンコーディング表示
  • HTMLの charset 指定
  • ブラウザの開発者向けツールやページ情報
  • CSVファイルを表計算ソフトで開くときの文字コード選択
  • メールや古いシステムから取り出したテキスト
  • APIやデータ連携で扱う文字列の仕様

仕事では、CSVを開いたら日本語が乱れた、古いページの一部だけ文字化けした、別サービスから取り込んだデータの記号が崩れた、という場面で文字コードを確認します。CSVなら、コピーをアプリのインポート機能で開き、提供元が示した文字コードを指定してプレビューを確かめます。「どの方式で読むか」と「別の方式で保存し直すか」は別の操作です。読めないまま元ファイルへ上書きせず、提供元や作成時の設定を確認します。

文字コードの流れを図で見る

文字コードは、文字、番号、バイト列、画面表示をつなぐ約束です。流れで見ると、次のようになります。

  1. 人が文字を書く
  2. 文字に対応する番号を見る
  3. 番号を保存・通信しやすいバイト列にする
  4. 読む側が同じ約束で解釈する
  5. フォントなどを使って画面に文字として表示する

この流れのどこかで、保存したときの約束と読むときの約束がずれると、文字化けが起きることがあります。

ミニクイズと次の文字ルート

Q1. 文字コードは何をする決まりですか?

文字をコンピューターが扱える番号やバイト列に対応させるための決まりです。

Q2. UnicodeとUTF-8は同じ意味ですか?

同じ意味ではありません。Unicodeは文字に番号を割り当てる大きな表、UTF-8はその番号をバイト列で表す方式の一つとして考えると入りやすいです。

Q3. 文字化けはどんなときに起きますか?

保存したときの決まりと、読むときの決まりがずれた場合などに起きます。環境やサービスによって原因が変わるため、保存形式と読み取り条件を確認します。

単位を確かめたいときはバイトとは、文字以外の情報も見渡したいときはデータとはが役立ちます。

二つの状態を組み合わせる理由はコンピューターが0と1を使う理由、ラボの文字カードで振り返るなら第73話:文字コードは何を決める?で確認できます。

自分の言葉で説明してみよう

手元のテキストエディタで新しい文書を作り、「Aあ」と入力してみましょう。保存時にUTF-8を選び、開き直して同じ文字が読めることを確かめます。

本文の表では、「Aあ」の文字データは1+3で4バイトです。ただし、保存したファイルには改行や、方式を示すBOMという印などが加わる場合があります。ファイルの容量が4バイトと一致しなくても、表が間違っているとは限りません。

文字の番号と、保存・読み取りの方式を分けて、次の文を埋めてみてください。

文字コードとは、____________を、コンピューターが扱える____________に対応させる決まりです。
Unicodeは____________、UTF-8は____________として考えると説明しやすいです。
文字化けは、保存したときと読むときの____________がずれると起きることがあります。

答えの例:

  • 文字コードとは、文字を、コンピューターが扱える番号やバイト列に対応させる決まりです。
  • Unicodeは文字の番号表、UTF-8はその番号をバイト列で表す方式として考えると説明しやすいです。
  • 文字化けは、保存したときと読むときの約束がずれると起きることがあります。

文字を読む約束は分かりました。では、文字や写真をファイルとして保存するとき、開き方や容量は何で変わるのでしょうか。次はファイル形式とはで、文字や画像を一つのファイルにどう収めるか、その決まりを見てみましょう。

この記事について

LAB WHITEBOARD

自分の言葉で説明してみよう

「文字コードが文字と番号やバイト列をつなぐ決まりであること、UnicodeとUTF-8の関係、文字化けが起きる理由を説明できるようになる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。