ファイルは、データの一般的な1まとまりです。スマホなども含むコンピュータを使う場合、普通に触れているものです。
Windowsならエクスプローラ、macOSならファインダー、UNIX/Linuxならls
コマンドなどを使っていることでしょう。
WordやExcelといった書類も、画像も、プログラムのソースコードも全て、ファイルです。 一般的にファイルを仕分けするための仕組みであるディレクトリ(もしくはフォルダ)と、 ファイルによってデータが格納されています。
ファイルには一部特殊なものがありますが、特殊なことをしない限りは、 ファイルサイズ分のデータが格納されています。
格納されているデータには、人間が読めるテキストデータと、人間が読めないバイナリーデータがあります。
バイナリー(binary)は、元々二進数という意味ですが、コンピュータでは全てのものを二進数の数字で取り扱っているため、 二進数という言葉が転じて、人間が読めないデータ全般を指します。
テキスト(text)は文字コードという一定のルールによって、人間が読める文字・文字列として解釈できるようになっているデータです。
バイナリーデータは、ビット(binary digit / bit)という 0
か 1
の2つのみの数字の集合体です。
現代では8ビットを1バイト(byte)と呼ぶコンピュータのみが生き残りました。
0か1の組み合わせが8つなので、2の8乗、つまり256の組み合わせをもつ1バイトは、0〜255の範囲の数字となります。
32ビットコンピュータや64ビットコンピュータは、一度に処理できる単位が2の32乗なのか、2の64乗なのか?というような違いがあります。
32ビットコンピュータならば2の32乗である4,294,967,296が基本単位です。
そういった環境では色々な情報を32ビットで扱うため、メモリサイズの上限が4GByteになってしまいます。
4GByteのメモリはイマドキのスマートフォンでも普通に搭載しているサイズであることを考えると32bitコンピュータは現代のプログラミングシーンでは力不足だといえるでしょう。
テキストは、一定のルールに従って、文字やその連なりである文字列として解釈できるデータだと説明しました。
現代であれば文字コードはutf-8(Unicode)だけを扱えればいいでしょう。大昔にはMicrosoftとIBMの独自規格であるShiftJISや、 UNIX系OSの独自企画であるEUCや、世界標準規格であるISO-2022などの規格がありましたが、 全世界の文字列はUnicodeで統一規格となり、それを取り扱うルールであるutf-8という方式が大々的に生き残りました。
まだUnicodeではカバーできない文字も残ってはいるため、一部ではUnicode/utf-8以外の方式もありますが、 それらの規格で作られたテキストファイルを見かけることや、処理する必要性はまずないレアケースだと考えても大丈夫でしょう。
Unicode(ユニコード)は文字の集合の取り決めです。ある番号にはある文字と「おおよそこういう形状1である」ということのみが決まっています。
utf-8は、Unicodeという16ビットの文字と、16ビットを複数組み合わせた文字の番号を、バイナリーデータに落とし込むための符号化方式です。
残念ながら、JavaやJavaScriptやMicrosoftの処理系などには、utf-8ではない符号化方式が一部残されていて、 未だに混乱の元ですが、それらもいずれは駆逐されていくことでしょう。
ある一定のルールに従って数字や文字に意味をもたせて、なにかを表現するのが符号です。
たとえば、utf-8では、0〜127の数字は、1バイトの0〜127で表現します。128から2047までの数字は2バイト、2048から65535までの数字は3バイトで表現します。
また、文字列の組み合わせから何かしらの形式を作り出すのも符号です。
符号に変換することを符号化と呼びます。元に戻すことを復号と呼びますが、日本語的な理由により復号化とは呼ばないですが、復号化と表現しても問題はないでしょう。たぶん。
JSONというのは、JavaScript Object Notationという、JavaScript発祥の汎用のデータ形式です。
{
"user": {
"name": "佐倉慈",
"nickname": "めぐねえ",
"attributes": [
"教師", "ゾンビ", "守護霊"
],
"ageAtDeath": 26
}
}
[list:sakura-megumi]では、user
の中に、name
が佐倉慈
で、nickname
がめぐねえ
であり、attributes
が教師
とゾンビ
と守護霊
の文字列の配列であるという定義がされています。
めぐねえの享年がわからなかったため26歳だとここでは仮定して、ageAtDeath
には26という数字で定義しています。
例えば、JavaScriptでこのデータにアクセスする場合は、user.name
で佐倉慈
を取得でき、user.attributes[0]
で教師
を取得できます。user.ageAtDeath
で26
という数字を取得できます。
他の有名な汎用データ形式には、XMLやYAML、MessagePackなどがあります。
現代では、汎用データを保存するときには、JSONを使えば大体問題はありません。XMLは仕様が仰々しすぎて、誰も扱いたくないというのが本音です。
Footnotes
-
これをグリフ(gryph)と呼びます。様々なフォントデータは、グリフを実際の文字の形状に落とし込んでいます。 ↩