
1010111。文字エンコーディングとは、文字体系の各文字を数値で表す慣習のことです。文字セットには自然言語の記号だけでなく、制御文字や空白文字など、言語以外の意味や機能を持つコードも含まれることがあります。文字エンコーディングは、いくつかの人工言語についても定義されています。エンコードされた文字データは、コンピュータによって保存、送信、変換することができます。[ 1 ]文字エンコーディングを構成する数値はコードポイントと呼ばれ、まとめてコード空間またはコードページを構成します。
光学式または電気式電信、そして初期のコンピュータに由来する初期の文字符号化方式は、言語で使用される文字のごく一部しか表現できず、大文字、数字、限られた句読点に限定されることもありました。時が経つにつれ、 ASCII、ISO/IEC 8859、そしてUTF-8やUTF-16などのUnicode符号化方式のように、より多くの文字を表現できる符号化方式が開発されました。
ワールドワイドウェブで最も普及している文字エンコーディングはUTF-8で、 2026年1月時点で調査対象のウェブサイトの98.9%で使用されている。 [ 2 ]アプリケーションプログラムやオペレーティングシステムのタスクでは、UTF-8とUTF-16の両方がよく使われるオプションです。[ 3 ]
文字コードの歴史は、かつては斬新だった電気的な手段を用いて、機械を介した文字ベースの記号情報を遠隔で伝達する必要性が進化してきたことを示している。最も初期のコードは、ベーコンの暗号、点字、国際海上信号旗、中国語電信コードのための中国語文字の4桁の符号化(ハンス・シェレルップ、1869年)など、手動および手書きの符号化および暗号化システムに基づいていた。電気および電気機械技術の採用により、これらの初期のコードは、初期の機械の新しい機能と制限に合わせて適応された。最もよく知られている電気伝送文字コードであるモールス符号は、1840年代に導入され、4つの「記号」(短い信号、長い信号、短い空白、長い空白)のシステムを使用して、可変長のコードを生成した。モールス符号の商業利用の中には機械によるものもあったが、多くの場合、電信キーで手動で生成され、耳で解読される手動符号として使用され、アマチュア無線や航空分野でも現在も使用されている。ほとんどの符号は、文字ごとの固定長、または固定長符号の可変長シーケンス(例:Unicode)である。[ 4 ]
文字符号化システムの一般的な例としては、モールス符号、ボードー符号、米国情報交換標準コード(ASCII)、そしてUnicodeが挙げられる。明確に定義され拡張可能な符号化システムであるUnicodeは、以前のほとんどの文字符号化システムに取って代わったが、現在に至るまでのコード開発の経緯はよく知られている。
5ビット符号化方式であるボード符号は、1870年にエミール・ボードによって考案され、1874年に特許を取得、1901年にドナルド・マレーによって改良され、1930年にCCITTによって国際電信アルファベットNo.2(ITA2)として標準化されました。ボードという 名称は、ITA2とその多くの派生版に誤って適用されてきました。ITA2には多くの欠点があり、多くの機器メーカーによって改良が加えられましたが、その過程で互換性の問題が生じることもありました。

19世紀後半、ハーマン・ホレリスは国勢調査データの分析のためにパンチカードによるデータ符号化を発明した。当初は各穴の位置が異なるデータ要素を表していたが、後に数値情報は下段の行を0から9まで番号付けすることで符号化され、列のパンチはその行番号を表すようになった。さらに後には、1列に複数のパンチを挿入できるようにすることでアルファベットデータも符号化されるようになった。電気機械式集計機は、カードが機械内を移動する際のパルスのタイミングによって内部的にデータを表現していた。
IBMが電子処理に移行した際、 IBM 603電子乗算器を皮切りに、パンチカードコードに関連付けられたさまざまなバイナリ符号化方式が使用されました。IBMは、1953年の702 [ 5 ]および704コンピュータ、そして後の7000シリーズおよび1400シリーズ、さらに関連周辺機器において、いくつかのバイナリ符号化10進数(BCD)6ビット文字符号化方式を使用しました。当時使用されていたパンチカードコードは数字、大文字の英字、およびいくつかの特殊文字に限定されていたため、6ビットで十分でした。これらのBCD符号化は、既存の単純な4ビット数値符号化を拡張してアルファベットと特殊文字を含め、すでに広く使用されていたパンチカード符号化に容易にマッピングしました。IBMのコードは主にIBM機器で使用されました。当時の他のコンピュータベンダーは、UNIVAC I [ 6 ]で使用されていた符号化のように、独自の文字コード(多くの場合6ビット)を持っていました。 IBMのBCDエンコーディングは、拡張二進化十進数交換コード(EBCDICと略されることが多い)の前身であり、1963年にIBM System/360向けに開発された8ビットのエンコーディング方式で、小文字を含むより多くの文字セットを特徴としていた。
1959年、米軍はFieldataコードを定義しました。これは米陸軍通信隊が導入した6ビットまたは7ビットのコードです。Fieldataは当時の多くの現代的な問題(例えば、機械照合用に配列された文字コードと数字コード)に対処しましたが、目標には達せず、短命に終わりました。1963年、ASCII委員会(Fieldata委員会のメンバーであるWF Leubbertが少なくとも1人含まれていました)によって最初のASCIIコード(X3.4-1963)がリリースされました。これはFieldataの欠点のほとんどを、よりシンプルな7ビットコードを使用して解決しました。変更点の多くは微妙なもので、特定の数値範囲内での照合可能な文字セットなどでした。ASCII63は成功を収め、業界で広く採用され、1967年のASCIIコード(小文字を追加し、「制御コード」の問題をいくつか修正)が後継として発行されたことで、ASCII67はかなり広く採用されました。ASCII67のアメリカ中心の性質は、ヨーロッパのECMA-6規格である程度対処されました。[ 7 ]さまざまなベンダー拡張機能やISO/IEC 8859シリーズなどの8 ビット拡張 ASCIIエンコーディングは、すべての ASCII 文字と追加の非 ASCII 文字をサポートしていました。
1980年代、研究者たちは普遍的に互換性のある文字エンコーディングを開発しようと試みる中で、一方では追加の文字に対応するためにビット数を増やす必要があるように思われたが、他方では、比較的少数のラテン文字セットを使用するユーザー(当時コンピュータユーザーの大多数を占めていた)にとって、それらの追加ビットは、当時希少で高価だったコンピューティングリソースの莫大な無駄遣いとなる(そのようなユーザーの場合、それらは常にゼロにされる)というジレンマに直面した。1985年当時、平均的なパーソナルコンピュータユーザーのハードディスクドライブはわずか約10メガバイトしか保存できず、卸売市場で約250米ドル(小売で個別に購入するとさらに高額)[ 8 ]であったため、当時はすべてのビットを有効活用することが非常に重要だった。
最終的にUnicodeとして採用された妥協案は、(電信符号に由来する)各文字が常に特定のビット列に直接対応しなければならないという前提を打破することでした。代わりに、文字はまずコードポイントと呼ばれる抽象的な数値の形で、普遍的な中間表現にマッピングされます。コードポイントは、文脈に応じて、さまざまな方法で、また文字あたりのデフォルトのビット数(コードユニット)も様々に変化して表現されます。8ビットユニットの場合の256を超えるなど、コードユニットの長さを超えるコードポイントをエンコードするには、可変長エンコーディングを実装し、エスケープシーケンスによって後続のビットをより高いコードポイントとして解析するように指示するという方法が採用されました。
文字エンコーディングに関連するさまざまな用語は、しばしば一貫性がなく、誤って使用されています。[ 9 ]歴史的には、同じ規格が文字のレパートリーと、それらをコードユニットのストリームにどのようにエンコードするかを規定していました。通常、コードユニットごとに1文字です。しかし、より高度な文字エンコーディングの出現により、用語の区別が重要になってきました。
文字は意味的価値を持つテキストの最小単位です。[ 9 ] [ 10 ]言語学 では、これをグラフェムと呼び、その様々な表記方法をグリフと呼びます。(例えば、セリフ体のgとサンセリフ体のgは、それぞれグラフェム⟨g⟩、U + 0067 g LATIN SMALL LETTER Gのグリフです。)
文字を構成する要素は、文字エンコーディングによって異なります。たとえば、発音記号付きの文字の場合、エンコードには 2 つの異なるアプローチがあります。単一の統合された文字 (合成済み文字として知られています) としてエンコードするか、個別の文字を組み合わせて 1 つのグリフにすることができます。前者はテキスト処理システムを簡素化しますが、後者はテキストで任意の文字と発音記号の組み合わせを使用できます。合字も同様の問題を抱えています。アラビア語やヘブライ語などの一部の文字体系では、文字の形状と結合が文脈によって決まります。
文字セットとは、テキストを表すために使用される文字の集合です。[ 9 ] [ 10 ]例えば、ラテン文字とギリシャ文字は文字セットです。
符号化文字セットとは、各項目が一意に数値にマッピングされた文字セットのことである。[ 10 ]
これはコードページとも呼ばれますが、[ 9 ]その用語は一般的には時代遅れです。元々、コードページとは、特定の文字エンコーディングを定義する IBM マニュアルのページ番号を指していました。 [ 11 ] Microsoft、SAP、Oracle Corporationなどの他のベンダーも、 Windows コードページやコードページ 437など、独自のコードページを公開しました。マニュアルの特定のページを指すことはなくなりましたが、多くの文字エンコーディングは依然として同じ番号で識別されます。同様に、コードページという用語は、文字エンコーディングを指すために今でも使用されています。
UnixおよびUnixライクなシステムでは、文字マップという用語は一般的に使用され、通常はロケールというより広い文脈で用いられます。
IBMの文字データ表現アーキテクチャ(CDRA)は、各エンティティをコード化文字セット識別子(CCSID)で指定し、これは文字セット、文字セット、コードページ、またはCHARMAPなどとも呼ばれます。[ 12 ]
文字レパートリーとは、特定のコード化された文字セットで表現できる文字の集合のことです。[ 10 ] [ 13 ]レパートリーは、新しい標準を作成しない限り追加が許可されないクローズドレパートリー(ASCIIやISO-8859シリーズのほとんどの場合)と、追加が許可されるオープンレパートリー(Unicodeや限定的な範囲のWindowsコードページの場合)があります。[ 13 ]
コードポイントとは、符号化された文字セットにおける文字の値または位置のことです。[ 10 ]コードポイントは、コードユニットのシーケンスによって表されます。マッピングはエンコーディングによって定義されます。したがって、コードポイントを表すために必要なコードユニットの数は、エンコーディングによって異なります。
コードユニットとは、文字エンコーディングで文字を表すことができる最小のビットの組み合わせです(コンピュータサイエンスの用語では、文字エンコーディングのワードサイズです)。 [ 10 ] [ 12 ]一般的なコードユニットには、7ビット、8ビット、16ビット、32ビットがあります。一部のエンコーディングでは、一部の文字が複数のコードユニットとしてエンコードされます。
例えば:
Unicodeと並行規格であるISO/IEC 10646ユニバーサル文字セットは、文字エンコーディングの統一規格を構成します。Unicodeは、文字をバイトに直接マッピングするのではなく、文字を固有の自然数(コードポイント)にマッピングするコード化された文字セット、それらのコードポイントが固定サイズの自然数(コードユニット)の系列にどのようにマッピングされるか、そして最後にそれらのユニットがオクテット(バイト)のストリームとしてどのようにエンコードされるかを個別に定義します。この分解の目的は、さまざまな方法でエンコードできる普遍的な文字セットを確立することです。モデルを正確に記述するために、Unicodeは既存の用語を使用し、新しい用語を定義します。[ 12 ]
抽象文字レパートリー(ACR)とは、システムがサポートするすべての抽象文字の集合のことです。Unicodeはオープンレパートリーを採用しており、時間の経過とともに新しい文字がレパートリーに追加されます。
符号化文字セット(CCS)とは、文字をコードポイントにマッピングする機能です(各コードポイントは1文字を表します)。例えば、特定の文字セットにおいて、ラテン文字の大文字「A」はコードポイント65、文字「B」は66などで表されます。複数の符号化文字セットが同じ文字セットを共有する場合があります。例えば、ISO/IEC 8859-1とIBMコードページ037および500は、いずれも同じ文字セットをカバーしていますが、それぞれ異なるコードポイントにマッピングしています。
ハードウェアおよびソフトウェアシステムは通常、16ビットまたは32ビットなどの最大「ネイティブ」ワード長を持っています。文字エンコーディングでは、システムのネイティブワード長を超える長さのコードポイントを定義する場合があります。文字エンコーディング形式(CEF)は、コードポイントを標準化された方法で分割し、各コードユニットがシステムのワード長内に収まるようにするコードユニットへのコードポイントのマッピングです。たとえば、16ビット単位で数値を表現するコンピュータは、1ユニットあたり最大65,535までのコードポイントしか表現できませんが、CEFで定義されているように、より大きなコードポイントは複数の16ビットユニットを使用して表現できます。
文字エンコーディング方式 (CES) は、コード単位をオクテットのシーケンスにマッピングして、オクテットベースのファイルシステムへの保存やオクテットベースのネットワークでの送信を容易にするものです。単純な文字エンコーディング方式には、UTF-8、UTF-16BE、UTF-32BE、UTF-16LE、UTF-32LEなどがあります。UTF -16、UTF-32、ISO/IEC 2022などの複合文字エンコーディング方式は、バイトオーダーマークやエスケープシーケンスを使用して複数の単純な方式を切り替えます。圧縮方式は、コード単位あたりに使用されるバイト数を最小限に抑えようとします ( SCSUやBOCUなど)。
UTF-32BEとUTF-32LEはよりシンプルなCESですが、Unicodeを扱うほとんどのシステムでは、固定長ASCIIとの下位互換性があり、Unicodeコードポイントを可変長のオクテットシーケンスにマッピングするUTF-8、または固定長UCS-2BEとの下位互換性があり、Unicodeコードポイントを可変長の16ビットワードシーケンスにマッピングするUTF-16BEのいずれかを使用しています。詳細については、「Unicodeエンコーディングの比較」を参照してください。
Unicode文字の特定のバリアントを選択するための追加情報を提供する上位レベルのプロトコルが存在する場合があります。特に、Unicodeで同じ文字として「統一」された地域バリアントが存在する場合に有効です。例として、XML属性xml:langが挙げられます。
Unicodeモデルでは、文字のシーケンスをバイトのシーケンスに直接割り当てる他のシステムに対して「文字マップ」という用語を使用しており、CCS、CEF、CESのすべてのレイヤーを網羅しています。[ 12 ]
文字は一般的に「U+」に続いて16進数のコードポイント値が記述されます。Unicode標準の有効なコードポイントの範囲(コード空間)はU+0000からU+10FFFFまでで、0から16までの番号で識別される17のプレーンに分割されています。U+0000からU+FFFFまでの範囲の文字は、基本多言語プレーン(BMP)と呼ばれるプレーン0にあります。このプレーンには、最もよく使用される文字が含まれています。他のプレーンのU+10000からU+10FFFFまでの範囲の文字は、補助文字と呼ばれます。
以下の表は、コードポイントの例を示しています。
「ab̲c𐐀」という文字列を考えてみましょう。この文字列には、Unicode結合文字(U+0332 ◌ ̲ COMBINING LOW LINE 、 ⟨ b ⟩の下線)と補助文字(U+10400 𐐀 DESERET CAPITAL LETTER LONG I)が含まれています。この文字列には、論理的に同等の複数のUnicode表現がありますが、それぞれがさまざまな状況や要件に適しています。
a、、、b̲c𐐀a、、、、b_c𐐀U+0061、、、、U+0062U+0332U+0063U+104000x00000061、、、、0x000000620x000003320x000000630x000104000x0061、、、、、0x00620x03320x00630xD8010xDC000x61、、、、、、、、、0x620xCC0xB20x630xF00x900x900x80特に注意すべき点は、𐐀 は 1 つの 32 ビット値 (UTF-32)、2 つの 16 ビット値 (UTF-16)、または 4 つの 8 ビット値 (UTF-8) のいずれかで表現されるということです。これらの形式はいずれも同じビット数 (32) を使用して文字を表現していますが、実際の数値バイト値がどのように関連しているかは明らかではありません。
複数の文字エンコーディングを使用する環境をサポートするために、文字エンコーディング方式間でテキストを変換するソフトウェアが開発されてきました。このプロセスはトランスコーディングとして知られています。代表的なソフトウェアには以下のようなものがあります。
ウェブ上で最もよく使われている文字エンコーディングはUTF-8で、 2026年1月時点で調査対象のウェブサイトの98.9%で使用されている。 [ 2 ]アプリケーション プログラムやオペレーティングシステムのタスクでは、UTF-8 とUTF-16の両方がよく使われています。[ 3 ] [ 18 ]
Android注: Androidプラットフォームのデフォルトは常にUTF-8です。
従来の
DEC
および
ISO文字セット(
ISO 2022
の構造と規則に準拠)に加えて
、
VT510は
PCTerm
モードで多数の IBM PC コード ページ (
IBM の標準文字セット マニュアルの
ページ番号
) をサポートし、業界標準の PC の
コンソール端末を
エミュレートします。
実際には、UTF-8が圧倒的に最も一般的なエンコーディングなので、通常はUTF-8を想定します。