国際化のためにunicodeを調べてみたけど難しすぎる…


## はじめに

このエントリー執筆時点のUnicodeの最新バージョンは7.0です

http://www.unicode.org/


## TL;DR

UTF-8の4バイトのシーケンスに含まれる絵文字(Emoticons: U+1F600-U+1F64F)やCJK統合漢字拡張B(CJK Unified Ideographs extension B: U+20000-U+2A6DF)などはOS、ブラウザの組合わせによって表示がまちまちです

どの組合わせにおいても標準状態ではフォントが足りていないようで完全に表示されるわけではありませんが、おおむね Windows の方が表示される文字が多いようです


検証は以下のサイトを利用しました

http://www.fileformat.info/info/unicode/block/emoticons/utf8test.htm
http://www.fileformat.info/info/unicode/block/cjk_unified_ideographs_extension_b/utf8test.htm


検証は以下の組合わせで行いました

|OS                        |Browser          |Version               |Emoticons|CJK Ext B|
|:-------------------------|:----------------|:---------------------|:-------:|:-------:|
|Windows7(http://modern.ie)|Internet Explorer|10                    |○        |○        |
|                          |Firefox          |34.0                  |○        |○        |
|                          |Chrome           |39.0.2171.71 m        |×        |○        |
|Mac OSX 10.9.5(Mavericks) |Safari           |7.1                   |○        |△        |
|                          |Firefox          |34.0                  |○        |△        |
|                          |Chrome           |39.0.2171.71 (64-bit) |×        |△        |

○ ほぼ表示される(数個表示できない文字もある)
△ 半数近く表示されない文字がある
× 文字が表示されない

検証環境が無かったためiOS、Androidデバイスの検証は出来ていません
iOSシミュレーターやNexus5(Firefox、Chrome)などでみる限り絵文字はおおむね表示され、CJK統合漢字拡張Bは半分近く表示されない状態でした

**データベースにmysqlを利用する場合、文字コードをutf8mb4で設定するとUTF-8の4バイトのシーケンスに含まれる文字の格納は出来ますが、ブラウザ毎の表示にばらつきがあるのでWebアプリケーションを国際化されている皆様はどのような対応をされているのでしょうか？**


## UnicodeとUTF-8の違い
端的に言うと以下の違いがある

Unicode: 文字集合
UTF-8:   符号化方式

例えばCJK統合漢字の一番最初にある漢数字一は以下のようになる

Unicode:     U+4E00
UTF-8(hex)   0xE4 0xB8 0x80

http://www.unicode.org/charts/PDF/U4E00.pdf
http://www.fileformat.info/info/unicode/char/4e00/index.htm


## コードポイントと符号位置

http://equj65.net/tech/charcode/

> 文字集合では、個々の文字に対して、文字集合内での符号位置が決められている。これをコードポイントという。
言い方を変えると、「文字集合を構成する文字を並べて、頭から順番に振った数値」のことだ。
このコードポイントはあくまで”その文字の文字集合内での位置”であり、符号化方式ではない

<!-- -->
> コードポイントは符号位置（文字集合内の文字の位置）であって、符号化方式ではない。そのためコードポイントはUnicodeの符号化方式であるUTF-8やUTF-16とは直接は関係しない




## Unicodeの文字列をソースコードに埋め込む
http://0xcc.net/blog/archives/000183.html

C, C++, Java, JavaScript, Ruby:  `"\u4E00"`
Python(2系): `u"\u4E00"`

http://docs.python.jp/3/howto/unicode.html


## CJK統合漢字

http://ja.wikipedia.org/wiki/CJK%E7%B5%B1%E5%90%88%E6%BC%A2%E5%AD%97

> CJK統合漢字（シージェーケーとうごうかんじ、英: CJK unified ideographs）は、ISO/IEC 10646（略称：UCS）およびUnicode（ユニコード）にて採用されている符号化用漢字集合およびその符号表である。CJK統合漢字の名称は、中国語、日本語、朝鮮語で使われている漢字をひとまとめにしたことからきている

http://www.taishukan.co.jp/kokugo/webkoku/series003_04.html


## 追加面

http://ja.wikipedia.org/wiki/%E8%BF%BD%E5%8A%A0%E9%9D%A2

> Unicodeは、当初現在の基本多言語面だけで全ての文字を表すことを目的として設計されたが、まもなく基本多言語面に全ての文字を入れるのが無理であることが分かり、基本多言語面に入りきらない文字を入れる追加面を定めていくことになった

<!-- -->
> 追加面の文字は、2バイト固定長方式のUCS-2では使用することが出来ず、UTF-8、UTF-16、UTF-32のいずれの符号化方式でも4バイトで符号化される。UTF-16ではサロゲートペア（代用対）を使う必要がある


## UTF-8のエンコード体系

http://ja.wikipedia.org/wiki/UTF-8#.E3.82.A8.E3.83.B3.E3.82.B3.E3.83.BC.E3.83.89.E4.BD.93.E7.B3.BB

> ASCII文字と互換性を持たせるために、ASCIIと同じ部分は1バイト、その他の部分を2-6バイトで符号化する。4バイトのシーケンスでは21bit (0x1FFFFF) まで表現することができるが、Unicodeの範囲外となる17面以降を表すもの（U+10FFFFより大きなもの）は受け付けない。また5-6バイトの表現は、ISO/IEC 10646による定義とIETFによるかつての定義で、Unicodeの範囲外を符号化するためにのみ使用するが、Unicodeによる定義とIETFによる最新の定義では、5-6バイトの表現は不正なシーケンスである

## その他参考資料

http://www.kansai-u.ac.jp/fl/publication/pdf_aids/29/1-3_nikaido.pdf

http://knife-tw.blogspot.jp/2013/10/os-x-109-mavericks.html

http://www.karitsu.org/summer-seminar/

http://constellation.hatenablog.com/entry/20110530/1306695104

http://mojikiban.ipa.go.jp/wp-content/uploads/2013/06/pdf/Web_Tech_Repo.pdf