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

文字ってなんだろう?身近だけど意外と知らない文字コードと絵文字の話 - 技育 CAMP 2021

文字ってなんだろう?身近だけど意外と知らない文字コードと絵文字の話 - 技育 CAMP 2021

Naoki Ikeguchi

September 24, 2021
Tweet

More Decks by Naoki Ikeguchi

Other Decks in Programming

Transcript

  1. 文字ってなんだろう?
    身近だけど意外と知らない文字コードと絵文字の話
    技育 CAMP / 株式会社ゆめみ
    Naoki Ikeguchi @siketyan

    View Slide

  2. $ whoami
    • 池口 直希 Naoki Ikeguchi a.k.a. しけちあ Siketyan
    • 21 卒 退 サーバサイドエンジニア
    • 元・豊田高専生 (愛知) #kosen18s
    • 愛知県江南市 出身
    • 東京都北区 在住
    https://s6n.jp/ Twitter: @s6n_jp
    2

    View Slide

  3. 3






    こんにちは,世界!


    View Slide

  4. 4

    View Slide

  5. 5






    こんにちは,世界!


    View Slide

  6. 6

    View Slide

  7. 文字コード
    • 私たちが使っている「文字」をコンピュータで扱えるように
    バイト列で表現する方法を定義したもの
    7
    文字 H E L L O
    16進 48 45 4c 4c 4f
    10進 72 69 76 76 79

    View Slide

  8. 8

    View Slide

  9. 9

    View Slide

  10. ASCII (American Standard Code for Information Interchange)
    • アルファベット・数字・一部の記号を定義した最も基本的な
    文字コードとして使われている
    • 1 文字を 7 ビットで表現することができ, 128 文字が定義される
    • バイトは 8 ビットだが先頭 1 ビットを誤り検出に使われていたことから
    • ほとんどの文字コードは ASCII を拡張する形で作られている
    • ASCII で定義された部分の文字はほとんどの文字コードで使える
    • もちろん日本語の仮名や漢字は定義されていない
    10

    View Slide

  11. ISO-2022-JP (JIS コード)
    • ASCII と日本語文字群を切り替えながら表現する方法
    • 切り替えにはエスケープシーケンスを使う
    • 日本語部分には 1 文字あたり 2 バイトを使う
    11
    文字 A (ESC) $ B 漢 (ESC) ( B C
    16進 41 1B 24 42 34 41 1B 28 42 43

    View Slide

  12. Shift_JIS (windows-31j, CP932)
    • エスケープシーケンスなしで ASCII と日本語を共存する
    • 特定のアルゴリズムで ASCII の未使用領域になるよう変換
    12
    文字 A 漢 C
    16進 41 8A BE 43
    ASCII は 0x7F までしか定義されない
    ので 0x8A と 0xBE は未定義領域

    View Slide

  13. UTF-8
    • Unicode 文字セットを使ってバイト列にするための文字コード
    • ASCII 部分は 1 バイト, それ以外は 2~4 バイトで表現する
    • 現在最も広く使われている
    13
    文字 A B C 漢 字
    16進 41 42 43 E6 BC A2 E5 AD 97

    View Slide

  14. Unicode
    • 世界の多くの言語に対応した文字の集合
    • The Unicode Consortium (現 Unicode Inc.) によって定義される
    • Unicode v14.0 現在 284,344 文字が収録済み
    • 定義されたコードポイントは 144,697 個
    • コードポイントとこの数の乖離については後述
    • 最大 1,114,112 文字まで定義できる
    14

    View Slide

  15. 文字コードと文字セット
    • 文字セットは人間が知っている「文字」を集めて番号をつけたもの
    • つけられた番号は符号位置(コードポイント)と呼ばれることが多い
    • 文字コードは,一つまたは複数の文字セットをバイト列と相互変換
    する方法を定義したもの
    • 例えば, Unicode のコードポイントは最大 4 バイトなので全て 4 バイトで表
    すこともできる (UTF-32) が,非常に効率が悪いので UTF-16 や UTF-8 と
    いった文字コードを使う
    15

    View Slide

  16. 文字化けはなぜ起こる?
    • 想定された文字コードと違うもので解釈しようとすると,
    意図しない文字として解釈されたり存在しなかったりする
    16
    バイト列 41 42 43 E6 BC A2 E5 AD 97
    UTF-8 A B C 漢 字
    Shift_JIS A B C 貍 ? ?

    View Slide

  17. 「文字」ってなんだろう?
    17

    View Slide

  18. 18
    नम#ते
    単語 (word)

    View Slide

  19. 19
    न म स् ते
    書記素 (grapheme)

    View Slide

  20. 20
    न म स ◌् त ◌े
    符号位置 (code point)

    View Slide

  21. One more thing…
    21

    View Slide

  22. 22

    View Slide

  23. 23
    = +
    U+1F44D U+1F3FB

    View Slide

  24. 24
    .len() == 2 * 2 = 4
    .chars() == 2

    View Slide

  25. 25
    = ?

    View Slide

  26. 26
    = + +
    +
    U+1F468 U+1F468 U+1F467 U+1F467
    U+200D U+200D U+200D

    View Slide

  27. 27
    .len() == 2 * 4 + 3 == 11
    .chars() == 4 + 3 == 7

    View Slide

  28. References
    • Twemoji
    https://twemoji.twitter.com/
    • 文字列でUTF-8でエンコードされたテキストを保持する
    The Rust Programming Language 日本語版 より
    https://doc.rust-jp.rs/book-ja/ch08-02-strings.html
    • Unicode® Version 14.0 Character Counts
    https://www.unicode.org/versions/stats/charcountv14_0.html
    • Japanese Character Encoding for Internet Messages (RFC1468)
    https://datatracker.ietf.org/doc/html/rfc1468
    28

    View Slide

  29. Questions?
    29

    View Slide

  30. Thank you
    30
    U+1F970

    View Slide