ISO/IEC 10646およびUnicode文字を8ビットの不定長として表現できるように変換したもの。
Javaでは実行ファイル(バイトコードと呼ばれる)内部で実際に用いられている文字コード符号化の方法であり、Java以外でもInternet ExplorerやMicrosoft Wordなどでサポートされている。
ASCIIと互換性があり、かつ世界中の言語を容易に扱えるということで徐々に人気が高まった。
この方法を用いるとASCII文字の範囲(0x00〜0x7f)を保存したまま、8ビット長でUnicode文字が表現可能となる。
従来の英語圏環境の文字コードと互換性が保たれるため、従来は英語専用だったソフトウェアを新規に多国語対応化する場合などには有用である。
古いRFC 2279で表現できる全範囲を以下に示す。新しいRFC 3629では、このうち最初の4つ、01FFFFFFまでの範囲に対応する。
| UCS-4 (16進) | UTF-8 (2進) |
|---|---|
| 00000000〜0000007F | 0xxxxxxx |
| 00000080〜000007FF | 110xxxxx 10xxxxxx |
| 00000800〜0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
| 00010000〜001FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
| 00200000〜03FFFFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
| 04000000〜7FFFFFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
UTF-8は、文字が次の範囲に限定されるため、途中の1文字を読むだけで、それが1文字目か2文字目以降かが識別可能である。
また0xFEと0xFFは予約されており、現時点では使用してはならない。
なお、UTF-16の範囲内に限定されているRFC 3629の仕様では、0xC0、0xC1、0xF5〜FFまでは使用されない。
UTF-8は、同じ番号を、複数の方法(長さ)で表現できる、という仕様上の問題がある。
例えば空白(U+0020)なら、UTF-8は次のいずれかで符号化できる。
このため、これらの文字の処理を適切に行なわないと、Unicode Directory Traversalというセキュリティホールを産む。
ちなみにRFC 3629では、次のような例が紹介されている。