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

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

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

D5744e72b6a5e6673f991cab987a31ab?s=128

Naoki Ikeguchi

September 24, 2021
Tweet

Transcript

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

  2. $ whoami • 池口 直希 Naoki Ikeguchi a.k.a. しけちあ Siketyan

    • 21 卒 退 サーバサイドエンジニア • 元・豊田高専生 (愛知) #kosen18s • 愛知県江南市 出身 • 東京都北区 在住 https://s6n.jp/ Twitter: @s6n_jp 2 ❌
  3. 3 <!DOCTYPE html> <html> <head> <meta charset="Shift_JIS"> </head> <body> <h1>こんにちは,世界!</h1>

    </body> </html>
  4. 4

  5. 5 <!DOCTYPE html> <html> <head> <meta charset="Shift_JIS"> </head> <body> <h1>こんにちは,世界!</h1>

    </body> </html>
  6. 6

  7. 文字コード • 私たちが使っている「文字」をコンピュータで扱えるように バイト列で表現する方法を定義したもの 7 文字 H E L L

    O 16進 48 45 4c 4c 4f 10進 72 69 76 76 79
  8. 8

  9. 9

  10. ASCII (American Standard Code for Information Interchange) • アルファベット・数字・一部の記号を定義した最も基本的な 文字コードとして使われている

    • 1 文字を 7 ビットで表現することができ, 128 文字が定義される • バイトは 8 ビットだが先頭 1 ビットを誤り検出に使われていたことから • ほとんどの文字コードは ASCII を拡張する形で作られている • ASCII で定義された部分の文字はほとんどの文字コードで使える • もちろん日本語の仮名や漢字は定義されていない 10
  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
  12. Shift_JIS (windows-31j, CP932) • エスケープシーケンスなしで ASCII と日本語を共存する • 特定のアルゴリズムで ASCII

    の未使用領域になるよう変換 12 文字 A 漢 C 16進 41 8A BE 43 ASCII は 0x7F までしか定義されない ので 0x8A と 0xBE は未定義領域
  13. UTF-8 • Unicode 文字セットを使ってバイト列にするための文字コード • ASCII 部分は 1 バイト, それ以外は

    2~4 バイトで表現する • 現在最も広く使われている 13 文字 A B C 漢 字 16進 41 42 43 E6 BC A2 E5 AD 97
  14. Unicode • 世界の多くの言語に対応した文字の集合 • The Unicode Consortium (現 Unicode Inc.)

    によって定義される • Unicode v14.0 現在 284,344 文字が収録済み • 定義されたコードポイントは 144,697 個 • コードポイントとこの数の乖離については後述 • 最大 1,114,112 文字まで定義できる 14
  15. 文字コードと文字セット • 文字セットは人間が知っている「文字」を集めて番号をつけたもの • つけられた番号は符号位置(コードポイント)と呼ばれることが多い • 文字コードは,一つまたは複数の文字セットをバイト列と相互変換 する方法を定義したもの • 例えば,

    Unicode のコードポイントは最大 4 バイトなので全て 4 バイトで表 すこともできる (UTF-32) が,非常に効率が悪いので UTF-16 や UTF-8 と いった文字コードを使う 15
  16. 文字化けはなぜ起こる? • 想定された文字コードと違うもので解釈しようとすると, 意図しない文字として解釈されたり存在しなかったりする 16 バイト列 41 42 43 E6

    BC A2 E5 AD 97 UTF-8 A B C 漢 字 Shift_JIS A B C 貍 ? ?
  17. 「文字」ってなんだろう? 17

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

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

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

  21. One more thing… 21

  22. 22

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

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

    2
  25. 25 = ?

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

    U+200D U+200D
  27. 27 .len() == 2 * 4 + 3 == 11

    .chars() == 4 + 3 == 7
  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
  29. Questions? 29

  30. Thank you 30 U+1F970