UnicodeとUTF-8の違いについて理解する

# UnicodeとUTF-8の違い
UnicodeとUTF-8は同じように語られることが多いような気がしますが、実際は次のように異なります。
今回の記事ではこれらの違いについて、簡単に説明していきます。

|名称|概要|
|:-:|:--|
|Unicode|文字集合（文字セット）|
|UTF-8|文字符号化方式|

## 文字集合（文字セット）

> cf. [文字集合(Wiki)](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E9%9B%86%E5%90%88)
> 文字集合を定義しその集合内の各文字に一意の符号化表現を関連付ける規則を符号化文字集合と言う。符号化文字集合には、例えばJIS X 0201、JIS X 0208、ISO/IEC 10646(UCS-2, UCS-4)等がある。標準や規格によって用語に違いがあり次のように定義されている。

文字集合（文字セット）とは、文字（キャラクタ）の集合のことを指します。

|名称|概要|
|:-:|:--|
|ASCII<br/>（ISO8859）|アルファベット、数字、記号、制御文字などの文字集合|
|JIS X 208<br/>(JIS90)|JIS第1水準、第2水準漢字の文字集合|
|JIS X 213<br/>(JIS2004)|JIS第3水準、第4水準漢字の文字集合（JIS X 208の文字集合も含む）|
|Unicode<br/>（UCS-2/UCS-4）|世界で使われる全ての文字を共通化した文字集合（JIS X 213の文字集合も含む）|

## 文字符号化方式

> cf. [文字符号化方式(Wiki)](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E7%AC%A6%E5%8F%B7%E5%8C%96%E6%96%B9%E5%BC%8F)
> 文字符号化方式（もじふごうかほうしき、英: character encoding scheme、CES）とは、符号化文字集合で文字に対応付けた非負整数値を、実際にコンピュータが利用できるデータ列（通常、バイト列）に変換する符号化方式。

文字集合を実際にプログラムで扱うための文字の内部表現のことを指します。

### JIS X 208(JIS90)

文字集合（文字セット）`JIS X 208(JIS90)`を表現する文字符号化方式の一例です。

|名称|概要|
|:-:|:--|
|EUC-JP|UNIX上で日本語の文字を扱う場合にもっとも多く利用されている文字コードのひとつである。UNIX以外のOS上で使われることもある。|
|Shift_JIS|コンピュータ上で日本語を含む文字列を表現するために用いられる文字コードのひとつである。|
|CP932|Shift_JISのMicrosoft拡張版。JIS X 213(JIS2004)の一部を含んでいたりする。|

### Unicode

文字集合（文字セット）`Unicode`を表現する文字符号化方式の一例です。

|名称|概要|
|:-:|:--|
|UTF-8|可変長（1-4バイト）の8ビット符号単位で表現する文字符号化形式及び文字符号化スキーム。|
|UTF-8-MAC|iOS、macOSで利用されるNormalization Form D (NFD) で符号化した UTF-8のことを指します。 |
|UTF-16|BMP文字を16ビット符号単位一つで、その他の文字をサロゲートペア（代用対）という仕組みを使い16ビット符号単位二つで表現する文字符号化形式及び文字符号化スキーム。UCS-2ともBMPの範囲で互換性がある。|
|UTF-32|Unicodeのすべての符号位置を単一長の符号単位として32ビットで表現する文字符号化形式及び文字符号化スキーム。実際に使われるのは21ビット（Unicodeの符号空間がU+10FFFFまでであるため）であり、この21ビットの範囲内ではUCS-4と互換性がある。|


## 補足
### ASCII
ASCIIは`文字集合（文字セット）`のコードポイント（文字集合内で一意となるように割り当てられた番号）と`文字符号化方式`の符号化した後のコードが同じです。
このため、ASCIIは`文字集合（文字セット）`と`文字符号化方式`の両方を表していると考えます。

### UTF-8-MAC

>cf. [UTF-8-MAC MacWiki](http://macwiki.osdn.jp/wiki/index.php/UTF-8-MAC)
>UTF-8-MAC とは、Mac OS X に付属する iconv にて利用できる文字エンコードの一つで、 Normalization Form D (NFD) で符号化した UTF-8 のことを指します。 一般に UTF-8 とだけいった場合には、Normalization Form C (NFC) でエンコードされたものを意味します。
>
>Unicode 標準では、NFC は正規結合(Canonical Composition)、 NFD は正規分解(Canonical Decomposition)として規定されています。 たとえば、「が」の字を NFC で表現すると U+304C (HIRAGANA LETTER GA) ですが、 NFD では U+304B U+3099 (HIRAGANA LETTER KA + COMBINING KATAKANA-HIRAGANA VOICED SOUND) という シークエンスになります。

`UTF-8`と`UTF-8-MAC`では、ザックリいうと濁音（バビブベボなど）、半濁音（パピプペポ）の表現方法が異なります。
このため、`iOS`、`Android`、`macOS`、`Windows`、`Linux`と幅広いシステム間で連携するアプリケーションを構築する場合は、`UTF-8とUTF-8-MACの違い`について考慮しておく必要があります。

# 参考にしたサイト
* [文字コードの考え方から理解するUnicodeとUTF-8の違い](http://equj65.net/tech/charcode/)
* [文字コード（UTF-8,Shift_JIS,EUC-JP,ISO-2022-JP）についての俺的まとめ](http://d.hatena.ne.jp/snaka72/20100710/SUMMARY_ABOUT_JAPANESE_CHARACTER_CODE)  
* [文字コードのカオスな世界を整理してみた](https://raintrees.net/news/51)  
* Wiki
  * [文字集合](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E9%9B%86%E5%90%88)
  * [文字符号化方式](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E7%AC%A6%E5%8F%B7%E5%8C%96%E6%96%B9%E5%BC%8F)
  * [JIS X 0213](https://ja.wikipedia.org/wiki/JIS_X_0213)
  * [Unicode](https://ja.wikipedia.org/wiki/Unicode)
* MacWiki
  * [UTF-8-MAC](http://macwiki.osdn.jp/wiki/index.php/UTF-8-MAC)