テキストファイルを読む💪


第1回
30分後には、生のテキストファイルが
読めるようになっているはず。知らんけど。
Unicode
世界中の全ての文字を集めて
番号を振るプロジェクト
今では世界的なスタンダード
文字コードの業界規格 by Wikipedia
Unicodeにおいて各文字に振られている番号を、
コードポイントと呼ぶ
「A」のコードポイントは65 (= 0x41)
「a」のコードポイントは97 (= 0x61)
「あ」のコードポイントは12354 (= 0x3042)
Unicodeでは、16進数表記を用いて
「A」はU+0041, 「a」はU+0061, 「あ」はU+3042
と表される
1980年代
当時の構想
Unicodeは16ビット固定長にしよう!
それぞれの文字に対して、
0x0000〜0xffffまでの番号を振る
(2^16 = 65,536個の文字を登録できる)
1991年10月
Unicode 1.0.0 制定
収録文字数は7,161
1992年6月
Unicode 1.0.1 制定
CJK統合漢字を導入
収録文字数は28,359
1990年代後半
16bitでは全然足りなかった


こうなることは割と以前から分かっていたらしい。
UTF-16 FAQ | What is UTF-16? とかに書いてあります
足りなくなったら足せばいい...?
もう16bitベースで開発が進んでいた
例: JavaのChar型
今更「1文字16bit」を変更することは不可能
でも16bitでは足りない
🤔🤔🤔
💡
2文字で1文字にしよう!
サロゲートペア
2文字分のデータを使って1文字を表す
UTF-16のみで用いられている
上位サロゲート: U+D800〜U+DBFF (1024通り)
下位サロゲート: U+DC00 〜 U+DFFF (1024通り)
上位サロゲート1024通りと下位サロゲート1024通りの
組み合わせで、
1024*1024 = 1,048,576通りの文字が表現できる
サロゲートペアの仕組み
32bit (16bit+16bit) で1つの文字を表現
U+29E3D (𩸽): U+D867 U+DE3D
変換式は部誌を見れば分かるはず (多分)
(次回やるかも)
これにより、Unicodeで表現できる文字数が大幅に増加
65,536 + 1,048,576 - 2,048 = 1,112,064
サロゲートペアの一例
これを用いてU+010000 〜 U+10FFFFまでが表される
合計でU+0000〜U+10FFFFまで全てを表現するには
1,114,112通り必要であるが、サロゲート領域の2,048を除くことで
1,112,064通りとなる
現在のUnicodeコードポイントの全てを表現するには、
21bit (= 2,097,152) あれば十分
=> UTF-8の話で詳しく
サロゲートペアはUTF-16の話
文字符号化方式 (所謂文字エンコーディング)の1つ
UTF-16
(Unicode Transformation Format 16)
文字符号化方式
文字集合 (Unicodeなど) -> バイト列
Unicodeに対応する文字符号化方式
UTF-8, UTF-16, UTF-32など
Unicodeに対応しない文字符号化方式
Shift_JIS, EUC-JPなど
UTF-8
1コードユニットは8bit
コードユニット1つ〜4つでUnicodeコードポイント1つ
に対応する可変長符号方式
コードユニット
日本語Wikipediaだと符号単位と訳されている
サロゲートペアとは、UTF-16コードユニット2つで
Unicodeコードポイント1つを表現するもの
UTF-32
1コードユニットは32bit
コードユニット1つでUnicodeコードポイント1つに
対応する固定長符号方式
UTF-16
1コードユニットは16bit
コードユニット1つまたは2つでUnicodeコードポイント
1つに対応する可変長符号方式
Unicodeコードポイントとの対応
UTF-8
1コードポイントを8bit〜32bit使って表していて、
ややこしい
対応表があるので見ながらやりましょう
対応表 by Wikipedia
UTF-16
基本的には、Unicodeコードポイントが16bitの
バイト列で保存されている。
サロゲート領域 (U+D800 〜 U+DFFF) が出てきたら、
サロゲートペアだな!と頭を切り替えられればOK
UTF-32
Unicodeコードポイントが21bitで十分表現可能である
のに対し、1コードユニットは32bit。
コードポイントが32bitのバイト列としてそのまま保存
されているので、特に考えるべきことはなく、
そのまま読めば良い
実際に読んでみる
アルファベットのみ
ひらがなのみ
UTF-8
アルファベットのみ
ひらがなのみ
UTF-16
アルファベットのみ
ひらがなのみ
UTF-32 (BE)
UTF-16 BE
U+FEFFはByte order mark
UTF-32 BE
U+FEFFはByte order mark
第1回 完
(次回も色々読む予定; 時期は未定)

テキストファイルを読む💪 第1回