Skip to content

文字コードへの道

公開日:

Download PDF

スライドテキスト

Page 1

文字コードへの道

The Road to Character Encodings

pixiv Inc.
USAMI Kenta

2024-01-28 #retro_games_any

レトロゲームから得た学びの発表 #01

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE / にゃんだーすわん
  • ピクシブ株式会社 pixiv事業本部 Webエンジニアリングチーム PHPer
  • Emacs PHP Modeを開発しています (2017年-)
  • プログラミング言語にちょっとこだわりのある素人 (spcamp2010)
  • ゲーム開発経験は学生時代にDXLibとか一瞬使ったくらい
  • 好きなゲームはスーパーロボット大戦シリーズ

Page 3

今回の発表の背景

(phpcon2024)

Page 4

さて

Page 5

コンピュータ内の データのイメージ

Page 6

非常に大雑把なイメージ

コンピュータのメモリ
= データを格納する箱が並んでいる

0 1 2 3 4 5 6 7 8 9 … 1,073,741,824

(1GBメモリ)

Page 7

データを整列して見る
1列で表示するとわかりにくいので 16個単位で折り返すことがよくある

0 1 2 3 4 5 6 7 8 9 A B C D E F

1x 2x 3x 4x

列 = 下1桁

5x 6x 7x 8x

Page 8

非常に大雑把なイメージ

四角い箱

文字列 Abc12

" "

= メモリ

A b c 1 2

Page 9

ところでコンピュータって
0と1の世界 なのでは…?

Page 10

0と1の世界

Page 11

0と1の世界

= binary

(2進法)

Page 12

0と1の世界

= binary

(2進法)

= bit

(2値データ)

Page 13

粒度が細かすぎる

Page 14

粒度が細かすぎる → まとめて扱おう

Page 15

粒度が細かすぎる → まとめて扱おう

= bytes

(バイト)

Page 16

非常に大雑把なイメージ

(再掲)

四角い箱
箱に入るのは

文字列 Abc12

" "

= メモリ
0〜256の数字だけ

A b c 1 2

数字に置き換えて箱に入れる

Page 17

データをまとめて扱う

  • コンピュータ上のデータを0と1だけで表現するのはわかりにくい
  • 現代では「1バイト=8個のビット」の塊として扱うのが標準的
    • 歴史的には、1バイト=7個のビットで扱う流れもあった
    • この「7」という数は現在までひっそりと影響を残している…
  • 8バイトの場合、0〜2 までの数を格納できる

8
(=256)

Page 18

日本語文字列をメモリに入れよう
× 文字列

"あいうえお"

あ い う え お

数字に置き換える方法を…

Page 19

文字をデータに
してみよう

Page 20

英語の文字をデータにしてみよう

2進数 10進数 文字

  • A, B, C, ... Z までのアルファベットだけを扱う

00000 0 A

  • 00001 1 B
    アルファベット26種類なので、

00010 2 C

5bit = 2 =32(種類)で表現できる

5

00011 3 D

00100 4 E

00101 5 F

00110 6 G

00111 7 H

… …

11001 25 Z

Page 21

ひらがなをデータにしてみよう

2進数 10進数 文字

  • あいうえお… わ を ん までの五十音を扱えるように

000000 0 あ

  • 6bit = 2 =64(種類)に収まる

6

000001 1 い

000010 2 う

000011 3 え

000100 4 お

… … …

101100 44 わ

101101 45 を

101110 46 ん

Page 22

ひらがなをデータにしてみよう

2進数 10進数 文字

  • あいうえお… わ を ん までの五十音を扱えるように

000000 0 あ

  • 6bit = 2 =64(種類)に収まる

6

000001 1 い

  • 000010 2 う
    カタカナや濁点を扱うには… どうすれば?

000011 3 え

000100 4 お

… … …

101100 44 わ

101101 45 を

101110 46 ん

Page 23

ひらがなをデータにしてみよう

2進数 10進数 文字

  • あいうえお… わ を ん までの五十音を扱えるように

000000 0 あ

  • 6bit = 2 =64(種類)に収まる

6

000001 1 い

  • 000010 2 う
    カタカナや濁点を扱うには… どうすれば?

000011 3 え

  • \ピコーソ/ そうだ、先頭ビットを濁点とカタカナに
    💡

000100 4 お

… … …

101100 44 わ

101101 45 を

101110 46 ん

Page 24

ひらがなをデータにしてみよう

2進数 10進数 文字

  • あいうえお… わ を ん までの五十音を扱えるように

000000 0 あ

  • 6bit = 2 =64(種類)に収まる

6

000001 1 い

  • 000010 2 う
    カタカナや濁点を扱うには… どうすれば?

000011 3 え

  • \ピコーソ/ そうだ、先頭ビットを濁点とカタカナに
    💡

000100 4 お

  • ↑ 小文字とか半濁点のこと考えてないよね…

… … …

101100 44 わ

101101 45 を

101110 46 ん

Page 25

16進数表

  • 文字エンコーディングとかバイナリファイルを向き合っていると
    ちょくちょくこの形式の表を見ることになるかと思います
    • メモリやディスク上のデータの表示 (バイナリエディタ)
    • エンコーディングのバイトデータと文字の対応表

Page 26

そういうことを考えると 文字コードを設計できる

Page 27

現在のコンピュータは
どうやって文字を扱うか

Page 28

ASCII (アスキー)

  • American Standard Code for Information Interchange
    • ↑ 正式名称は覚えなくていい
  • いわゆる「半角文字」「半角英数」とか呼ばれる文字コード
    • アメリカ英語で使用されるアルファベット(ラテン文字)をカバー
  • 0〜127までの7bitだけを使うので、1バイト=8bitとして扱うと
    必ず先頭が0になる

Page 29

Unicode

  • 大統一文字コード
    • 世界中の文字を統合して一個の表にしようぜ! プロジェクト
    • 表に割り当てられた文字を「コードポイント」と呼ぶ
      • U+1234 のように書く
  • 最初は16bit = 2 = 65536種類の空間あれば十分じゃね?と

16

思われていたらしい

Page 30

UTF-8

  • 8bit固定で1〜4バイトの可変長エンコーディング
    • ASCIIの文字(いわゆる半角文字)は1バイトで扱える
    • そのほかの文字は可変長
      • 典型的な日本語の文字は3バイト
      • 半角カナは4バイト

Page 31

制御文字

Page 32

21世紀の環境で Unicode以外を
採用する動機は激減

Page 33

かつてはそうでは
なかった
(と伝え聞く)

Page 34

歴史的な事例

Page 35

有名な逸話

『しんでしまうとは なにごとだ!』 堀井雄二(編集・執筆)
株式会社スクウェア・エニックス
デジタル版 Ver.1.00 2018年9月1日(Kindle)
p11より引用

Page 36

ドラゴンクエスト

(ファミリーコンピュータ)

  • 1986年5月27日発売
  • 512Kbitロムカセット (64KBytes)
    • プログラムROMとキャラクタROMがそれぞれ32キロバイト
      • モンスターやキャラクターなどの画像とフォントなどを
        全部この32キロバイトに押し込める必要がある
      • プログラムとテキストデータが残り32キロバイト

Page 37

ドラゴンクエスト (FC) 解析資料 - 文字コード より引用 (2025年1月28日閲覧)

Page 38

ドラゴンクエスト (FC) 解析資料 - 文字コード より引用 (2025年1月28日閲覧)

第三章 自分だけのオリジナルマップを作ろう (kuwatan.jp) より引用
(2025年1月28日閲覧)

Page 39

ドラゴンクエストV

(スーパーファミコン)

  • 1992年9月27日発売
  • 12MBitロムカセット (1.5MBytes)
    • DQ1の時代から考えれば無限に広く見えるが…
    • プログラム・テキスト・グラフィック・音楽などあらゆる要素がリッチに
    • テキストデータはハフマン符号による可変長ビット(!)
      ドラクエ命 第 II 部 解析 第 3 章 SFC 版ドラクエ 5 (1992) 3.6. テキスト解析

Page 40

ポケットモンスター

(ゲームボーイ)

  • 1996年2月27日発売 (DQのほぼ10年後)
  • 8Mbitロムカセット (1MBytes):DQの16倍
    • DQ1の時代から考えれば無限に広く見えるが… 151匹のポケモンを押し込むには明らかに大変
    • 文字列は独自の2バイトコードを定義している
      • アルファベットは13文字しか含まれていない(!)

Page 41

文字コード対応表 - pokemonbug @ ウィキ - atwiki より引用 (2024年12月22日閲覧)

Page 42

社長が訊く『ポケットモンスター ハートゴールド・ソウルシルバー』 より引用 (2025年1月28日閲覧)

Page 43

今や文字コードを独自設計し たり、フォントをビット単位 で押し込めるような時代では
なくなった

Page 44

サイズ削減のためバンドルするフォント
ファイルの文字種を削ったり、
独自の文字を表示するためにUnicodeの
私用領域を使うことはあると思う