Unicode
世界的にいろいろある文字コードを漢字などざっくり統一したもの
16bitから拡張された21bitぐらいのコード系
JIS X 0221 ISO/IEC 10646 とも基本的に互換
日本語からはJIS X 0208 X 0212 X 0213 などで標準化された文字のほか、絵文字などが収録される
ISO/IEC 10646の初版は互換性なし
Unicode Technical Standard (UTS)もあり
UTS #46 Unicode IDNA Compatibility Processing
Code Point 32bit
UCS-4 で表せる文字のコード
Code Unit
UTF-8, UTF-16, UTF-32のそれぞれの単位
複数個でCode Pointを指す場合がある
Code Pointは
JISの区点コードと同じく
群 Group 24bit 16777216文字 (ISO/IEC 10646 で使用可能) Unicode 2011年廃止
面 Plane 16bit 65536文字
区 Row 8bit 256文字
点 Cell 1文字
の単位で分けられる
基本の65536文字の基本多言語面に納まらなかったので拡張面が増えている
16bitの面が17ある形でそれ以上は増えない予定 ISO/IEC 10646でも制限がなかったが17面に制限された?
第0面 基本多言語面 Basic Multilingual Plane BMP
第1面 追加多言語面 Supplementary Multilingual Plane SMP
第2面 追加漢字面 Supplementary Ideographic Plane SIP
第3面 第三漢字面 Tertiary Ideographic Plane TIP
4-13 (未割当)
第14面 追加特殊用途面 Supplementary Special-purpose Plane SSP
第15-16面 私用面 Supplementary Private Use Area-A, Supplementary Private Use Area-B SPUA-A/B
バージョン
全体のバージョンと面単位のバージョンがあるようだ ISO 10646と互換性を保ちつつ更新されている
Unicode 1.xは 16bit、ISO/IEC 10646は初期から32bitで進んでいる
Unicode 1.0
Unicode 1.1 FSS-UTF (UTF-8)
Unicode 2.0 サロゲートペアで拡張空間が定義 10ffffまで
Unicode 3.0 一般的に利用されはじめたバージョン
Unicode 3.1 追加漢字面, 追加多言語面, 追加特殊用途面
Unicode 4.0
Unicode 5.1 異体字セレクタ
Unicode 6.0 携帯絵文字
Unicode 10.0 2017年6月
Unicode 12.0 日本語旧字体
Unicode 14.0 絵文字顔文字
Unicode 15.0 2022-09-14
JIS X 0213 は BMPのほか、追加漢字面を使用する (Unicode 3.2.0 で全項目集録)
Windows XP JIS90
Windows Vista JIS2004
Windows 8 異体字
Windows 8.1 Adobe-Japan-1-7
4.0ぐらいから使える形に
コード体系
UCS ISO/IEC 10646でのコード体系
UCS-4 32bitコード 下位21bitまでしか使わない予定
UCS-2 16bitコード 基本多言語面のみ 多面化でUTF-16に移行して廃止?
面区点で分けられる
UCS-2はBMPのみ収録したコード系、UCS-4は17面利用可能なコード系
符号化方式
Unicode版、ISO/IEC 10646版があるが、基本的に同じ
UTF
UTF-7 RFC 1642 → 2152 → 廃止
UTF-8 RFC 2044 → 3629 Unicode 1.1 Appendix A でISO 10646側から取り込まれた?
UTF-16 RFC 2781 Unicode 2.0のサロゲートペアに対応した形式 ? ISO 10646ではどこから?
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UTF-7 RFC 2152は廃止された Unicode標準ではない
国際化ドメイン名 (IDNA)用にPunycodeなどがある
文字コードは基本的にバージョン等が付加されて区別されるがUnicodeは更新が速いので? UTFはバージョンは付加しない
UTF-16, UTF-32では上位バイトと下位バイトの順がどちらでも可能、判別のためにBOM(Byte Order Mark)がある。UTF-8では基本的に必要ないがMicrosoftなどが一時期利用したため混乱したこともある。JSONなどではBOM禁止
濁音、半濁音などは文字と1つのコードで表現することも、別々に表現することも可能
合成済み文字 (が)
基本文字 + 合成文字 (か゛)
全角、半角の区別は基本的にしない、従来のShift_JISの半角カナ、全角アルファベットは互換文字として存在するが利用しないことが推奨される
正規化
文字の表現方法にいくつか派生もあるので検索などで一致するよう正規化方法が4つぐらいある
NFD 正準等価により分割される
NFC 正準等価により分割され、再度合成される
NFKD 互換等価により分割される
NFKC 互換等価により分割され、正準等価で合成される
Windows, Linuxなどは合成された状態、Macは分割された状態で利用されがち
Macのは厳密にはNFDなどとは違うらしく、UTF-8-MACと呼ばれたりするらしいがUTF-8関係ないからやめようね
正規化に色々足したものにIDNAなどのStringprep/Nameprep 改めPRECIS Frameworkがあるのでその枠で考えてみるといいか?
互換性
UTF-8はUS-ASCII, ISO 8859-1 互換として先頭128文字が同じ 256文字も文字はたぶん同じ
16bitの基本多言語面のみで利用することも考慮されていたり UCS-2 (廃止)
JISとは円記号など一部非互換文字がある
漢字が国ごとに異なる字体になることがあるため異体字セレクタが作られた
合成文字などで扱い方に何パターンかあるNFCとかいろいろ
互換性のない文字同士でコード変換されることで文字化けが起きることも
Unicodeのみで運用できれば文字化け問題はなくなる?
円記号問題などが残っている
RFC 5198 Unicode Format for Network Interchange