UnicodeとUTF-8の違いは? - 自分的まとめ

UnicodeとUTF-8の違いは? - Humanityはあんなに反響があるとは思わなかった。
ブコメにコピペじゃなくてまとめを書いてくれれば良い資料になるのにと書いてあったので今度は自分の知識をまとめてみる。
と言っても自分もあのスレを見るまでUnicodeUTF-8を混同してた一人なのでほとんどあのスレからの知識ですが...orz
なので簡単なまとめ。引用を多分に含みます。間違ってたらつっこんでいただけるとうれしいです。

調べる際に弾さんのエントリがかなり参考になったので(今頃意味が分かってきた)関連リンクとして度々載せさせていただきます。
参考リンクじゃない理由は解説しているエントリだけじゃなくて既存のエンコーディングを拡張するといった高度なエントリも含まれているため。


UnicodeUTF-8

まず一番重要なことは

であるということ。(用語についてはwikipedia:文字コードの「(符号化)文字集合文字符号化方式」が詳しい)
文字集合ではあるけれどUnicode自体にも番号(コードポイント)は付いている。
コードポイントを使う符号化方式にはUTF-32, UCS-4, UCS-2がある。(>>326,>>327)

UnicodeとUCS

Unicodeコンソーシアムが作った文字集合Unicode
ISO 10646で定義された文字集合がUCS。
(>>67)

完全に同一の規格ではないが、両者は互換になるように働きかけあっているので今のところ同じ文字集合と見なして問題ない。(>>75)
詳しい違いについてはwikipedia:ISO/IEC_10646を参照。

MS Windowsにおける「Unicode

MS Windows では「Unicode」といえば UTF-16 のリトルエンディアンという暗黙の了解になっている。(>>42)

またWindowsの内部コード(〜WなWindows APIが言う「Unicode」)は

(>>277)

符号化方式のバイト長

可変長: UTF-8(1〜4octet), UTF-16(2octetか4octet)
固定長: UCS-2(2octet), UCS-4(31bit), UTF-32(4octet), UTF-7(7bit)


UTF-8, UTF-16, UCS-2, UCS-4以外は合ってるか確認できなかった。

BOM(Byte Order Mark)

それぞれのアプリケーションでの扱いについては元記事の>>342-364 を参照。
wikipedia:Unicodeの「エンコーディング(符号化方式)」の「UTF-8」にこんな説明が。

UTF-8符号化スキームについて、日本国内でのみバイト順マーク[3] (BOM) がついているものをUTF-8、ついていないものをUTF-8Nとして区別することがあるが、国際的には認知されていない。もともと8ビットを符号単位とするUTF-8ではBOMを付与する必要はないが、UTF-8であることが識別できるようにデータストリームの先頭に EF BB BF (U+FEFFのUTF-8での表現) の3バイトが付与されることがある。Windowsのメモ帳で作成した「Unicodeテキスト」にはBOMが付与される。Internet Explorerでは、BOMのついていないUTF-8の文書を読み込むと(日本語版の場合)Shift_JISだと誤認する一方で、BOMがついていると有効なデータとして受け付けないアプリケーションも存在する。UTF-8のBOMはバイト順を表すものではなく、UTF-16符号化スキーム等における「真の意味でのBOM」と類似する存在であるがゆえに慣用的にこう呼ばれているに過ぎない。

実際どうすればいいんでしょうね。

UTF-8以外の文字コードの問題

文字コード中にヌルバイトや改行(0x0a)が出てくるのでC言語の関数がうまく機能しない。(>>91)
UTF-16Java(char)やJavaScriptや上で言ったようにUnicode Windows APIの内部コードの標準文字コードになっている。
(>>108,>>271-277)