UTF-16 (1993)(ユーティーエフシックスティーン)
Unicode 2.0 (1996) で標準化された 16bit ベース可変長エンコーディング。BMP (Basic Multilingual Plane) は 2 バイト・補助文字 (絵文字・古代文字等) はサロゲートペア (4 バイト) で表現。Windows API/.NET/Java/JavaScript の内部文字列表現として広く利用される。
概要
UTF-16 (UCS Transformation Format - 16bit) は、Unicode 2.0 (1996) で標準化された 16bit ベースの可変長エンコーディングで、BMP (Basic Multilingual Plane、基本多言語面 U+0000-U+FFFF) は 2 バイト・補助文字 (絵文字・古代文字・補助漢字等 U+10000-U+10FFFF) はサロゲートペア (4 バイト) で表現します。元々の Unicode 1.0 (1991) は UCS-2 (固定 2 バイト) で 65,536 字の表現を想定していましたが、絵文字・古代文字・補助漢字の追加で 65,536 字では不足が判明、1996 年の Unicode 2.0 でサロゲートペア機構を導入し UTF-16 として再定義され、Unicode 全範囲 (16 億字、実用上 110 万字) を表現可能になりました。Windows API (Win32)・.NET String・Java String・JavaScript 文字列の内部表現として広く利用され、OS 内部処理での文字列扱いが UTF-16 ベースとなることが多いです。
主な特徴・仕組み
- 規格化: Unicode 2.0 (1996)、ISO/IEC 10646
- バイト数: 2 バイト (BMP) または 4 バイト (補助文字)
- BMP (U+0000-U+FFFF): 2 バイトで表現、65,536 字
- 補助文字 (U+10000-U+10FFFF): サロゲートペア (4 バイト)
- サロゲートペア: 高位 (D800-DBFF) + 低位 (DC00-DFFF)
- エンディアン: UTF-16BE (Big Endian) / UTF-16LE (Little Endian)
- BOM: FE FF (BE) または FF FE (LE)
- ASCII 非互換: 0-127 範囲も 2 バイト
- 自己同期性: 部分的 (サロゲートペアで考慮必要)
- 代表用途: Windows API・Java String・.NET String・JavaScript 文字列
スペック比較表
| エンコーディング | バイト数 | ASCII 互換 | エンディアン | 用途 |
|---|---|---|---|---|
| UTF-8 | 1-4B | 完全 | 不要 | Web/ファイル |
| UTF-16 | 2 or 4B | 不可 | BE/LE | OS 内部 |
| UTF-32 | 4B | 不可 | BE/LE | 処理用 |
| UCS-2 | 2B 固定 | 不可 | BE/LE | UTF-16 の旧版 |
具体例・対応技術
- Windows API (Win32): 1993 年 Windows NT から UTF-16 (元 UCS-2)、
CreateFileW等の W 系関数 - Java String (1995-): Java 標準ライブラリの文字列、UTF-16 ベース
- .NET String (2002-): C#/VB.NET の
String型、UTF-16 内部表現 - JavaScript String: ECMAScript 仕様、UTF-16 内部表現
- Qt QString: C++ クロスプラットフォーム GUI、UTF-16 内部
自作PCでの選び方・注意点
UTF-16 は OS 内部処理での選好性が高く、Windows API を直接呼ぶ C++ 開発・Java/C# プログラミングで意識する必要があります。Windows ファイル名は内部的に UTF-16 (NTFS の Unicode サポート)、Win32 API の *W 系関数 (例: CreateFileW・ReadFileW) で UTF-16 ワイド文字 (wchar_t*) を受け取ります。Java/C# 開発者は文字列が内部 UTF-16 であることを意識せずに使えますが、サロゲートペアを含む絵文字・古代文字を処理する際に文字数カウントで問題が発生 ("𝕊".length は 2 になる)。JavaScript も同様で、for...of で正しく 1 文字ずつ取得可能。ファイル保存・ネットワーク送信では UTF-16 より UTF-8 が圧倒的に主流、UTF-16 は内部処理用と割り切るのが現代的な使い分けです。
関連用語との違い
- UCS-2: 固定 2 バイト、Unicode 1.0、UTF-16 の前身、サロゲートペアなし
- UTF-8: 1-4 バイト、ASCII 互換、ファイル・Web 標準
- UTF-32: 4 バイト固定、最も冗長、内部処理用
よくある質問(FAQ)
Q1: サロゲートペアとは? A: BMP 外の文字 (絵文字・古代文字) を 4 バイトで表現する機構。高位サロゲート (D800-DBFF) + 低位サロゲート (DC00-DFFF) のペアで、合計 100 万字以上の補助文字を表現可能。
Q2: なぜ Windows API は UTF-16? A: Windows NT 1993 年設計時に Unicode 1.0 (UCS-2 固定 2 バイト) を採用、当時 65,536 字で十分と判断。後にサロゲートペア導入で UTF-16 となった。
Q3: 文字数カウントで問題が出る理由は?
A: 「ABCD😀」の長さを length で取ると JavaScript/Java では 6 になる (絵文字がサロゲートペアで 2 単位)。Array.from(str).length や Unicode aware なライブラリ使用が必要。
まとめ
- UTF-16 = 1996 年 Unicode 2.0 標準化、16bit ベース可変長
- BMP 2 バイト + 補助文字サロゲートペア 4 バイト
- Windows API/Java/.NET/JavaScript の内部文字列表現
- ファイル/ネットワーク用途では UTF-8 が主流、内部処理向け