「文字コード」「エンコーディング」をより厳密にいうと
「Coded Character Set(符号化文字集合)」、「Character Encoding Scheme(文字符号化スキーム)」
符号化文字集合とは文字に番号が付けられた文字表であると理解するとよいだろう。
それに対して、文字符号化スキームとは個別の文字に対して特定のビット表現を対応付けるものである。符号化文字集合は、使用できる文字の種類を確定する働きを持つ。
そして、文字符号化スキームはそれらの文字がどのようなビットの並びで表現されるかを確定する働きを持つ。この2つは両方がそろわないと機能しない。
種類 | 備考 | ||
ASCII | 一覧 | ||
JISコード | 制御コード :0x00〜0x1F、0x7F ASCII文字 :0x20〜0x7E 半角カタカナ:0x21〜0x5F (7ビット) / 0xA1〜0xDF (8ビット) 漢字 :0x2121〜0x7E7E (第1バイト・第2バイトとも0x21〜0x7E) 補助漢字 :0x2121〜0x7E7E (第1バイト・第2バイトとも0x21〜0x7E) |
||
シフトJIS(MS漢字コード) | 制御コード:0x00〜0x1F、0x7F ASCII文字:0x20〜0x7E 半角カタカナ:0xA1〜0xDF 漢字:0x8140〜0x9FFC、0xE040〜0xFCFC (第1バイト: 0x81〜0x9F、0xE0〜0xFC 第2バイト: 0x40〜0x7E、0x80〜0xFC) |
||
日本語EUC |
|
|
|
Unicode |
Unicodeでは、すべての文字を16bit以内 |
|
UTF (UCS Transfer Format)
UTF-8 (8-bit UCS Transformation Format) UCS-2で定義される文字集合を用いて記述された文字列をバイト列に変換する方式の1つ。1文字を1〜6バイトの可変長マルチバイトに変換する。 |
UTF-16 (16-bit UCS Transformation Format): UCS-2で定義される文字集合を用いて記述された文字列に、UCS-4の一部の文字を埋め込むためのエンコード方式。UTF-8と併用することができる。UCS-2で利用できる文字数を大幅に増やすことができる。 |
UTF-1
当初ISO 10646の付録に収録されていたUTFです。 UCS-2/4の1文字を、1〜5バイトの可変長バイト列にエンコードします。エンコード後のバイトデータは、 ISO 2022のGLおよびGR (0x21〜0x7E、0xA1〜0xFE)の範囲になっているため、 ISO 2022を前提とした伝送路を安全に通過することができます。エンコードには除算を使います。
UTF-1は、通信や外部記憶などで用いる情報交換用エンコーディング法として設計されましたが、 UTF-8という強力な対抗馬に押され、ほとんど使われることのないままISO 10646からも削除されてしまいました。既存のシステムの多くは、ASCII図形文字の一部の文字を特殊文字 (区切り文字、エスケープ文字、引用符など)として使っています。このようなシステムにはUTF-1は適しません。 UTF-1は、GLとGRの領域をフルに使っているため、エンコード後のデータの第2バイト以降にもGLに相当するコードが現れ、これがASCIIの特殊文字と誤認されて誤動作するおそれがあるからです (シフトJISの第2バイトに0x5Cがあるとバックスラッシュと誤認される問題と似ています)。この点を改善したのがUTF-8です。
UTF-8(UTF-2, UTF-FSS)
UTF-8は、UTF-1同様、UCS-2/4の1文字を、 1〜6バイトの可変長バイト列にエンコードします。ただし、UCSの非ASCII文字はGR相当のコード(0xA0〜0xFF)のみを使ってエンコードします。これにより、上記のようなシステムでも、 ASCII以外のコードがASCIIと誤認されるおそれはなくなります。また、 UTF-8はエンコード/デコードがビットシフトだけで行えるので、効率の面でもUTF-1より有利です。
UTF-8は別名をUTF-2、あるいはUTF-FSS(File System Safe)といいます。 FSSという名前は、ファイル名に使ってもパス名の区切り文字(UNIXではスラッシュ、 Windowsではバックスラッシュ)と誤認されたりしない、というところからきています。 UTF-8は多くの企業・組織によって支持されており、 ISO 10646の補遺に収録されてUTF-1にとってかわりました。 UnicodeをサポートするOSやアプリケーションでは、すでに外部コードとして使われ始めています。
UTF-8とは、ASCIIの部分は従来どおり1バイトで表して互換性を取りたいということから、他の文字を2バイト、3バイトと異なる長さで符号化するようにしたもの。漢字領域は3バイトになってしまうので、日本語を扱う場合は非効率になるが、プログラミングでは有利ということからJavaの文字コードとしても採用されている。RFC 2279を参照。
UTF-7
UTF-1やUTF-8は8ビットの伝送路を前提としていますが、インターネットではいまだに7ビットしか通さない伝送路も珍しくありません。また、メールのヘッダ部などでは、 ASCII図形文字の使用すら制限されていることがあります。そのような状況でもUCSをエンコードするために考案されたのがUTF-7です。
UTF-7は、MIMEのBase64エンコーディングやuuencodeと類似の方法によって、 UCSの非ASCII文字をASCII図形文字にエンコードします。エンコードされた非ASCII部分の前には+を、後ろには-を置くことによって、「地」のASCIIテキストと区別します。
UTF-7はもともと上記のような制限の強い状況で使うためのものであり、広範囲に使われることを目的としたUTF-1やUTF-8とは性格が異なります。
UTF-7は、ASCII部分以外の16ビットの文字を、Base64の変形版を使って7ビットで符号化したもの。RFC 2152を参照。
UTF-16
これは、UTFと名付けられてはいますが、目的も内容も他のUTFとは全く異なっています。他のUTFはASCIIテキストにUCSを混ぜるためのものですが、 UTF-16はUCS-2のテキストにUCS-4(の一部)を埋め込むためのものです。したがって、他のUTFと併用することもできます。
UTF-16では、UCS-4のうちBMPの次の16面(群00の面01〜10、総文字数1メガ)のコードを、 O領域のコード2個(サロゲート・ペア surrogate pair)に変換してUCS-2のテキストに埋め込みます。これにより、UCS-2で表現可能な文字数を大幅に増やすことができます。
他の符号化方法としては、1文字あたり4バイト(31ビット)を使った正規形式のUCS-4、Unicodeの特殊文字領域の一部を使ってUCS-2でカバーされない文字を4バイトで符号化するUTF-16がある。
BOM
Unicodeはビッグエンディアンとリトルエンディアンの双方を許容している。
これらは、複数バイトから構成されるデータを、上位バイトから先に記述するか、下位バイトから先に記述するかの点で異なる。
つまり、エンディアンを間違って処理するとまったく意味のないデータを処理することになってしまう。マークとはこれを判定するために付加されるマークのことである。マークであって、文字ではない。
これを「BOM」(Byte Order Mark)という。
http://euc.jp/i18n/ucsnote.ja.html
http://euc.jp/i18n/charcode.ja.html#chap1
http://www.atmarkit.co.jp/fxml/rensai/w3cread27/w3cread27_3.html
MS932 | |
CP943C | MS932に対して、IBM外字を含むものらしい http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcode/bbs.cgi?past=1&c=gr&n=93 |
SJIS shift_jis 二つは同じもの
WINODWS-31J MS932 二つは同じもの
http://d.hatena.ne.jp/akumakario/20080522/1211452983
キャラクタセット一覧
http://www.iana.org/assignments/character-sets