文字列

文字列（もじれつ）は、単語や文章のような、文字の連なったもの。ストリング ()、テキスト () という場合もある。コンピュータ、特にプログラミングの分野で用いることが多い。

 プログラミング言語における文字列 
文字列の処理は、数値演算と並んでコンピュータの基本的処理である。多くのプログラミング言語に文字列を扱うためのデータ型やサブルーチン（手続き、関数、メソッドとも）などが用意されている。C#のように文字列が組み込みの基本型として用意されている言語もあれば、C言語のように文字列を基本型として持たない言語もある。

FORTRANに始まる伝統的な言語では、1文字は1バイトの数値で表現され、文字列は一般にメモリ上で連続する文字のシーケンス、つまり文字の配列によって実現される。文字列の終了を示すために末尾に特定の文字を番兵として格納する方式の言語と、別途長さを示す情報を持たせる言語がある（長さの情報をどう持たせるかは実装に任されている）。前者の主要な採用例にはC言語とC++があり、終了文字としてヌル文字を使う（ヌル終端文字列もしくはゼロ終端文字列とも）。後者の例としては拡張Pascal（Extended Pascal、ISO/IEC 10206）やObject Pascalなどがある。Microsoft WindowsおよびCOM環境でよく使われるBSTRのように、ゼロ終端文字列と長さ情報を併用するデータ構造もある[MS-DTYP]: BSTR | Microsoft Learn。

コンピュータにおいて全ての情報は数値（ビットの並び：ビット列）として表現されるので、文字列中の個々の文字も最終的にはビット列として記憶され演算される。この文字とビット列との対応付けが文字コードである。プログラミング言語やオペレーティングシステムなどによって扱うことのできる文字コードに違いはあるが、同じ文字コードであれば、同じビット列から同じ文字を取り出すことができる。

1バイトで表される数値、すなわち文字のコードと実際の文字の対応付けはいくつかの方式があり、ASCIIコードが代表的なものである。その後、漢字など多くの文字を使う文化圏のために1文字を多バイト列で扱えるように言語に拡張が行われるようになった。例えばC言語の標準規格C95では、従来の1バイト文字型のシーケンスで論理的な1文字を表現するマルチバイト文字方式をサポートするためのライブラリ、および1バイト以上の情報を格納できるワイド文字型wchar_tが追加された。多バイト文字のコードにはJISコード、EUC、Unicode (UTF-8/UTF-16/UTF-32) など各種ある。Javaなど後発の言語では当初からUnicodeベースの文字・文字列に対応したものもある。なお、Unicodeにサロゲートペアや結合文字、書記素クラスタ (grapheme cluster) が導入されたことで、論理的な1文字が16ビットあるいは32ビットの範囲に収まりきらなくなったため、データ構造的には文字ではなく文字列として扱わなければならないケースもある。

C言語では言語機能レベルでの文字列サポートが全く無く、文字列の長さや文字配列のバッファ長、メモリ寿命管理を意識するなどしながら慎重にプログラミングする必要がある。C言語の配列は第一級オブジェクトではなく、したがって文字列も第一級オブジェクトではない。文字列リテラルの記法やコンパイル時のリテラル連結機能はあるものの、実際の型はヌル終端の固定長文字配列である（固定長文字配列の初期化やポインタへの代入にのみ使用することができる）String literals (C) - cppreference.com。文字列の結合やコピーも、直感的な操作はできず、あくまでポインタ経由で文字の配列を扱うためのstrcatやstrcpyといった基本的な関数しか用意されていない。しかし、C++のようなオブジェクト指向言語をはじめ、動的言語・スクリプト言語・マクロ言語と呼ばれるものなど、後発の高水準言語ではそのような不便さや鬱陶しさなどなく文字列を直感的に扱える機能やライブラリが標準で用意されている。

JavaやC#のような後発言語では、文字列は文字配列によるバッファとその長さ情報を含むカプセル化されたデータ構造によって実現されることが一般的となっている。また、ヌル文字は終端の役割を持たないので、文字列シーケンス中にヌル文字を含むこともできる。Javaの文字型は2バイトのUTF-16であり、また文字列クラスで使われている内部表現もUTF-16だが、Javaクラスファイルの定数テーブルなどで使われているエンコードはModified UTF-8と呼ばれる特殊な形式である（ヌル終端文字列であってもシーケンスの途中にヌル文字に相当する代替データを含むこともできるように修正が施されている）Chapter 4. The class File Format | Java SE 8 Specifications > Java Virtual Machine Specification | Oracle。

文字列定数（文字列リテラル）の表記には、たいていのプログラミング言語で開始記号と終了記号にダブルクォーテーションの組が使われることが多いが、シングルクォーテーションの組を使う言語や、必要に応じてどちらも使える言語もある。以下はC#の例である。

string s = "abc 123";

C++の標準ライブラリで定義されているstd::basic_stringクラステンプレートはC文字列との相互運用性があり、また内部バッファとして使われている文字配列の要素を直接変更することもできるようになっているが、後発の言語およびプログラミング環境では、通常の文字列をイミュータブルなデータ型として提供していることが多い。代表例はJavaのクラスと.NETのSystem.Stringクラスである。文字列バッファを直接編集する場合は、Javaではクラスやクラスを、.NETではSystem.Text.StringBuilderクラスStringBuilder Class (System.Text) | Microsoft Learnを使う。Objective-Cの場合、通常のNSStringクラスNSString | Apple Developer Documentationはイミュータブルであり、編集可能な文字列型として別途NSMutableStringクラスNSMutableString | Apple Developer Documentationが用意されている。

 脚注 

 注釈 

 出典 

 関連項目 
キャラクタ (コンピュータ)
空文字列
ワイド文字
テキストファイル
文字列探索
正規表現

Category:データ型
Category:コンピュータのデータ
*