一般用語
上級

UTF-16 (1993)(ユーティーエフシックスティーン)

Unicode 2.0 (1996) で標準化された 16bit ベース可変長エンコーディング。BMP (Basic Multilingual Plane) は 2 バイト・補助文字 (絵文字・古代文字等) はサロゲートペア (4 バイト) で表現。Windows API/.NET/Java/JavaScript の内部文字列表現として広く利用される。

0 回閲覧
0 いいね
2026/5/11 更新
関連タグ
UTF-16
Unicode
サロゲートペア
BMP
UCS-2
Windows API

概要

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-81-4B完全不要Web/ファイル
UTF-162 or 4B不可BE/LEOS 内部
UTF-324B不可BE/LE処理用
UCS-22B 固定不可BE/LEUTF-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 が主流、内部処理向け
この記事について
カテゴリー一般用語
難易度上級
作成日2026/5/11