1. kasei-san

    No comment

    kasei-san
Changes in body
Source | HTML | Preview
@@ -1,88 +1,89 @@
もう[文字コード](http://qiita.com/kasei-san/items/cfb993786153231e5413)は[おなかいっぱい](http://qiita.com/kasei-san/items/3ce2249f0a1c1af1cbd2)なのですが...
# Unicode と UTF の違い
- Unicode : 符号化文字集合
- UTF : 符号化方式
符号化文字集合と、符号化方式についてはこちらを参照 -> [本当は怖くないCP932](http://qiita.com/kasei-san/items/cfb993786153231e5413#shift_jis-%E3%81%A3%E3%81%A6%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%81%AA%E3%81%AB%E3%82%92%E6%8C%87%E3%81%99%E3%81%AE)
# Unicode
- 文字セットの切り替えなしに、世界中の文字を単一文字集合として扱う符号化文字集合規格
- 21ビットの範囲(0x00000〜0x10FFFF)
- 各文字の位置は先頭に `U+` をつけて表す( **Unicodeコードポイント** と呼ぶ)
- 例えば 🗿 ならば `U+1F5FF`
# UTF-8, UTF-16, UTF-32 の違い
## UTF-32
- Unicodeコードポイントをそのままつかった符号化方式
- 21ビットだと切りが悪いので、32ビット
## UTF-16
- 1文字16ビット
+- **元々、unicodeは16ビットの固定長として開発されたため** 、最初はUTF-16が、unicodeの唯一の符号化方式だった
- 16ビット以上の文字については、 **サロゲートペア** という仕組みで16ビットx2で表現
### サロゲートペア
- Unicode1.0では、16ビット固定で、2^16(=65,536)個に全ての文字を入れる計画だった
- U+0000〜U+FFFF
- 漢字圏のこと考えてねぇ...
- 漢字入りきらねぇよ! ってなって、Unicode3.0で拡張された
- U+0000〜U+10FFFF
- で、元々全て16ビットの範囲内に入ると思って作られたUTF-16だと入りきらない! となって、対応方法が検討された
### サロゲートペアの方法
- U+D800〜U+DFFF までには文字を割り当てない
- これらを **サロゲートコードポイント** と呼ぶ
- U+D800〜U+DBFF を **上位サロゲート** と呼ぶ
- U+DC00〜U+DFFF を **下位サロゲート** と呼ぶ
- UTF-16では、上位サロゲートと下位サロゲートの組み合わせで、U+10000以降の文字を表現している
- UTF-16専用の仕様であるが、これらの為にUnicodeがサロゲートコードポイントを策定しているので、他のUTFも影響を受けた
- サロゲートコードポイントには、当然どのUTFでも文字は宛てられていない
## UTF-8
- UTF-16の内、1バイトで表せる文字(ASCII)については、1バイトで表す( **ASCIIの上位互換** )
- 残りについては、範囲に応じて 2バイト〜4バイト にエンコードする
- エンコード方法についてはこちらを参照 -> [UTF-8](http://exlight.net/devel/unicode/utf8.html)
- 必要に応じて文字のバイト数が変動するので、容量の無駄が少ないのが特徴
### UTF-8 mb4
- 4バイト対応のUTF-8のこと
- Unicode2系までは、UTF-8は最大3バイトだったので、3バイトまでしか対応していないUTF-8実装があった
- 例えばMySQLは、5.5.33までは4バイト対応しておらず、後から追加された絵文字や追加漢字(𠮷とか)は格納できなかった
# 絵文字についてメモ
- 絵文字が追加されたのは、2010年の Unicode 6.0から
- 以下のバージョン以降のOSは標準で対応している
- windows : 8以降
- MacOS : 10.7(Lion)以降
- それ以前のバージョンでも絵文字対応しているフォントを落とせば見れるらしい
- 参考 : [Help:特殊文字 - Wikipedia](https://ja.wikipedia.org/wiki/Help:%E7%89%B9%E6%AE%8A%E6%96%87%E5%AD%97#.E6.90.BA.E5.B8.AF.E9.9B.BB.E8.A9.B1.E3.81.AE.E7.B5.B5.E6.96.87.E5.AD.97)
-
# その他色々
- Microsoft Windows や Javaでは "Unicode" といえば **UTF-16 のリトルエンディアン** という暗黙の了解になっている。
-
-
+ - 元々Unicodeが16ビット固定長で開発されたという歴史的経緯のため
# 参考
- https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
- [Unicode - Wikipedia](https://ja.wikipedia.org/wiki/Unicode)
- http://graphemica.com/%F0%9F%97%BF
- 文字コード毎の詳細情報が見れて便利
+- [絵文字がある種のUnicodeバグを世界から一掃しつつある件について|Rui Ueyama|note](https://note.mu/ruiu/n/nc9d93a45c2ec)
+
## サロゲートペア関係
- [Unicode のサロゲートペアとは何か - ひだまりソケットは壊れない](http://vividcode.hatenablog.com/entry/unicode/surrogate-pair)
- [サロゲートペア入門:CodeZine(コードジン)](http://codezine.jp/article/detail/1592)