Upgrade to Pro — share decks privately, control downloads, hide ads and more …

文字 is 何?

tsuda.a
March 27, 2024

文字 is 何?

コンピューターを触っていると、文字を表示したり入力したりしますが、その文字はどうやって記録されているのでしょう?というお話。

tsuda.a

March 27, 2024
Tweet

More Decks by tsuda.a

Other Decks in Technology

Transcript

  1. 7 6 5 4 3 2 1 0 16進 10進

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 2 2 0 0 0 0 0 0 1 1 3 3 0 0 0 0 0 1 0 0 4 4 0 0 0 0 0 1 0 1 5 5 0 0 0 0 0 1 1 0 6 6 0 0 0 0 0 1 1 1 7 7 0 0 0 0 1 0 0 0 8 8 0 0 0 0 1 0 0 1 9 9 0 0 0 0 1 0 1 0 A 10 0 0 0 0 1 0 1 1 B 11 0 0 0 0 1 1 0 0 C 12 0 0 0 0 1 1 0 1 D 13 0 0 0 0 1 1 1 0 E 14 0 0 0 0 1 1 1 1 F 15 0 0 0 1 0 0 0 0 10 16 … … 1 1 1 1 1 1 1 0 FE 254 1 1 1 1 1 1 1 1 FF 255 こんな感じで表現されている。 • 1 ビット は ON(=1) か OFF(=0) かで表現する。 • 1 バイトは 8 つの ON/OFF の組み合わせで表現する。 • 1 バイトで 0-255 の値を表現できる。
  2. 組み合わせて。 • 1バイト(8ビット)で 256 通り • 2バイト(16ビット)で 6 5536 通り

    • 3バイト(24ビット)で 1677 7216 通り • 4バイト(32ビット)で 42 9496 7296 通り
  3. 0x 1x 2x 3x 4x 5x 6x 7x 0 NUL

    DLE SP 0 @ P ` p 1 SOH DC1 ! 1 A Q a q 2 STX DC2 " 2 B R b r 3 ETX DC3 # 3 C S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u 6 ACK SYN & 6 F V f v 7 BEL ETB ' 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L \ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL 対応表はこんな感じ。 • ASCII といいます。
  4. 0x 1x 2x 3x 4x 5x 6x 7x 8x 9x

    Ax Bx Cx Dx Ex Fx 0 sp & - 0 1 / A J 1 2 B K S 2 3 C L T 3 4 D M U 4 5 E N V 5 6 F O W 6 7 G P X 7 8 H Q Y 8 9 I R Z 9 A : B . , # C < * % @ D ( ) _ ' E + ; > = F ? " ところで‘A’が 41 である必然性はあるのか? • 必然性はない。 • 誰かがそう決めただけ。(多分) • かつては他の符号化方式もあった。 他の符号化方式の例 (EBCDIC)
  5. 0x 1x 2x 3x 4x 5x 6x 7x 0 NUL

    DLE SP 0 @ P ` p 1 SOH DC1 ! 1 A Q a q 2 STX DC2 " 2 B R b r 3 ETX DC3 # 3 C S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u 6 ACK SYN & 6 F V f v 7 BEL ETB ' 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L \ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL とはいえ • しかし 7 ビット (128文字)では英字で埋まってしまう。 • 8 ビット(= 1 バイト) に拡張しても、漢字は無理。
  6. 最終的に。 • 約209万文字 (21bit, ~U+1F FFFF) 割りつけられるようにしよう! • Unicode (UTF-8)

    爆誕 注意) ここのくだりはイメージです。 厳密には事実と異なります(汗 # そもそも、この資料そのものが全体的に嘘くさいのではありますが・・・
  7. コードポイント バイト数 ビット列 バイト列 有効ビット U+0000-U+007F 1 0xxxxxxx - -

    - 00-7F - - - 7 U+0080-U+07FF 2 110xxxxx 10xxxxxx - - C0-DF 80-BF - - 11 U+0800-U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx - E0-EF 80-BF 80-BF - 16 U+10000-U+1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx F0-F7 80-BF 80-BF 80-BF 21 21 ビットだと 3バイトあれば表現できるが・・・ • これまで使ってきた ASCII と互換がとれるよう、英数字だけの場合は従来 どおり、1 バイトで表現できるようにしよう! • なので、一文字最大 4 バイトで表現することに。
  8. 0x 1x 2x 3x 4x 5x 6x 7x 8x 9x

    Ax Bx Cx Dx Ex Fx 0 1バイト文字 マ ル チ バ イ ト 文 字 2 バ イ ト 目 以 降 2 バ イ ト 文 字 先 頭 バ イ ト 3 バ イ ト 文 字 先 頭 バ イ ト 4 バ イ ト 文 字 先 頭 バ イ ト 1 2 3 4 5 6 7 8 た ぶ ん 空 き 9 A B C D E F マッピングはこんな感じ • 1バイト文字、のところには、ASCII と同じ内容が割り当てられています。
  9. 先頭に 3 バイト余計な何かが記録される。 • 本来は UTF-8 には必要のないもの。 • だけれども問題がないなら、BOM 付きのほうが良いかもしれない。

    (BOM があることで文字コードの自動判定をミスりにくくなるから。) • よくわからない間は BOM 付きをデフォルトで使ってください(ぇぇぇ
  10. Windows の改行 • CR (0x0D) + LF (0x0A) の2文字。 •

    CR は Carriage Return の略。日本語では「復帰」 • LF は Line Feed の略。日本語では「改行」
  11. 余談2) なぜ ShiftJIS を ANSI と言うのか。 • JIS は日本産業規格 •

    ANSI は米国規格協会(American National Standards Institute) • ASCII は ANSI が定めている規格 • ShiftJIS 実装は米国版のローカライズとして実装 • ANSI とは米国版では ASCII と同義だが、日本だとローカライズの結果、 漢字も表示できるようになった。(=ShiftJIS は ASCII のフリをしている) • なので、Windows 上では ANSI で保存 = ShiftJIS だが、ShiftJIS を 表現するために ANSI と言うのは間違い。