Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

UTF-16(ユーティーエフじゅうろく)とは | 意味や読み方など丁寧でわかりやすい用語解説

UTF-16(ユーティーエフじゅうろく)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

ユーティーエフいちに (ユーティーエフイチニ)

英語表記

UTF-16 (ユーティーエフじゅうろく)

用語解説

UTF-16は、Unicode文字セットをコンピュータ上で表現するための文字エンコーディング方式の一つである。主に、世界の主要な言語の大部分をカバーするBasic Multilingual Plane (BMP) 内の文字を2バイト(16ビット)の固定長で効率的に表現することを目的としている。しかし、BMP外のより多くの文字(補助文字)も表現できるよう、可変長エンコーディングの特性も持ち合わせている。

Unicodeは、世界中のあらゆる文字を一意の番号(コードポイント)で識別する文字集合の国際標準であり、UTF-16はそのコードポイントをバイト列に変換する具体的な方法を定義する。UTF-16では、一つの文字を表現する最小単位として16ビット(2バイト)を用いる。

詳細な符号化の仕組みとして、まずBasic Multilingual Plane (BMP) に属する文字について解説する。BMPはUnicodeのU+0000からU+FFFFまでの範囲に定義される文字群で、これにはラテン文字、ギリシャ文字、キリル文字、アラビア文字、ヘブライ文字、漢字(一部)、ひらがな、カタカナなど、世界の主要な言語のほとんどの文字が含まれる。UTF-16において、これらのBMP文字は単一の16ビット符号単位(2バイト)で直接符号化される。例えば、日本語の「あ」(U+3042)はそのまま2バイトで表現される。この固定長表現は、BMP文字の処理において効率的であるという利点をもたらす。

一方、UnicodeはU+10FFFFまで拡張されており、BMP外の文字、すなわち補助多言語面(SMP)や補助漢字面(SIP)などの補助文字も定義されている。これらの文字は、単一の16ビット符号単位では表現しきれないため、UTF-16では「サロゲートペア」と呼ばれる特別な仕組みを用いる。サロゲートペアは、2つの16ビット符号単位(合計4バイト)を組み合わせて一つの補助文字を表現する方法である。具体的には、U+D800からU+DBFFまでの範囲にある「上位サロゲート(High Surrogate)」と、U+DC00からU+DFFFまでの範囲にある「下位サロゲート(Low Surrogate)」がペアになって、BMP外の文字のコードポイントを示す。これらのサロゲートコードポイント自体は有効な文字として割り当てられておらず、必ずペアで用いられることで補助文字を識別する。この仕組みにより、UTF-16はUnicodeで定義された全ての文字を表現することが可能となる。

UTF-16の主な特徴としては、BMP内の文字が固定長の2バイトで扱える点が挙げられる。これは、特に漢字やひらがな、カタカナなど、BMP内に多くの文字を持つ東アジア言語のテキストを扱う際に、UTF-8と比較して文字数とバイト数の関係が比較的単純で、効率的な場合があることを意味する。例えば、UTF-8では日本語の文字は通常3バイトを要するが、UTF-16では2バイトで表現される。しかし、ASCII文字のような1バイトで表現できる文字は、UTF-16では最低でも2バイトを消費するため、英語圏のテキストやプログラムコードなど、ASCII文字が大部分を占めるデータではUTF-8よりもファイルサイズが大きくなるという欠点がある。

また、UTF-16にはエンディアン(バイト順)の問題が存在する。16ビットの符号単位をメモリやファイルに保存する際、上位バイトと下位バイトのどちらを先に配置するかによって、リトルエンディアン (LE) とビッグエンディアン (BE) の二つの方式がある。この違いにより、異なるエンディアンで符号化されたデータは正しく解釈できない可能性がある。この問題を回避するため、UTF-16で符号化されたファイルには、ファイルの先頭にバイトオーダーマーク (BOM) と呼ばれる特殊な文字U+FEFFを付加することが一般的である。このBOMは、データのエンディアンを示す役割を果たす。ただし、BOMの有無や処理方法はアプリケーションによって異なるため、互換性の問題を引き起こすこともある。

利用例としては、Microsoft Windowsオペレーティングシステムの内部文字コードとして広く採用されていることが挙げられる。Windows APIの多くの関数はUTF-16を使用しており、GUIアプリケーション開発などにおいて頻繁に利用される。また、かつてのJava言語の内部文字コードとしてもUTF-16が使われていた時期がある(現代のJavaでは文字列の内部表現はUTF-16であるが、ファイルI/OなどではUTF-8が推奨されることが多い)。ウェブ上ではUTF-8が主流であるのに対し、システム内部や特定のアプリケーション間でのデータ交換ではUTF-16が依然として重要な役割を担っている。

UTF-16は、その特性から特定の環境や目的においては非常に有効なエンコーディング方式であるが、可変長であること、ASCII文字の効率、エンディアンの問題などを理解し、用途に応じて他のエンコーディング方式(例えばUTF-8)との適切な使い分けが求められる。

関連コンテンツ