開発者向けUnicode FAQ--もう知らないではすまされない

杉山貴章(オングス)
2012-02-09 11:27:00
  • このエントリーをはてなブックマークに追加

UTF-8、UTF-16、UTF-32ってどう違うの?

 歴史的な経緯から、Unicodeの符号化方式には複数の種類が存在する。PCやウェブサイトなどでテキストファイルの保存形式としてよく使われているのはUTF-8で、これは符号位置を8ビット符号単位の1~4つで表現する方式である。ASCIIコードとの互換性があって、ASCII文字であれば従来どおりの1バイトで表現できる一方、漢字や仮名などは3バイトで表現される。

 UTF-16はWindowsの内部コードやJavaの内部コードとして採用されている方式で、符号位置を16ビット符号単位1つまたは2つ表現する。もともとは16ビット符号1つで全ての符号位置を表現する計画だったが、文字の種類が多く領域が足りなくなったため、16ビット符号2つをペアにして使う「サロゲートペア」と呼ばれる方式が導入された。

 UTF-8やUTF-16が複数の符号単位を組み合わせて1つの符号位置を表現するのに対して、すべての符号位置を32ビット符号単位1つで表現するのがUTF-32である。1つの符号位置の表現が必ず4バイトの固定長になるため、内部処理で扱いやすいという特徴がある。

 上記の他に、電子メールで利用する目的で作られたUTF-7などがある。

UTF-16LEの「LE」ってなに?

 JavaやWindowsでは文字列表現にUTF-16が採用されているが、ドキュメントでは「UTF-16LE」と書かれているのを目にする。この「LE」とは何だろうか。

 UTF-16は16ビット符号単位で符号位置を表現するが、ファイルの読み書きや通信などでは、「符号化スキーム」を使って8ビットのバイト列にしてから扱う必要がある。その際、ペアとなる2つのビット列をどの順番で並べるかという問題が発生する。

 このとき、下位8ビットを先頭に配置する方式を「リトルエンディアン」と呼び、この方式を採用した符号化スキームを「UTF-16LE」と表現する。一方、上位8ビットを先頭に配置する方式を「ビッグエンディアン」と呼び、この方式の符号化スキームを「UTF-16BE」と表現する。その他、リトルエンディアンかビッグエンディアンかをデータストリームの先頭にバイト順を区別するための「バイト順マーク(BOM)」を置いて表現する方式もあり、単に「UTF-16符号化スキーム」という場合にはこの方式を差すことが多い。

 UTF-32でも同様の問題が生じるため、UTF-32の符号化スキームにはUTF-16と同様に「UTF-32LE」「UTF-32BE」、そしてBOMでバイト順を区別する「UTF-32」がある。

 なお、UTF-8ではエンディアンに関わらず同じバイト表現になるためこの問題は発生しない。したがってBOMも必要ないが、UTF-8でエンコードされていることを示すBOM(EF BB BF)を付加する場合もある。代表的な例では、Windowsのメモ帳で「Unicode」形式で保存したテキストデータにはBOMが付けられる。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]