Skip to content

Latest commit

 

History

History
95 lines (59 loc) · 6.12 KB

chap-basic-file.md

File metadata and controls

95 lines (59 loc) · 6.12 KB

ファイル

ファイルは、データの一般的な1まとまりです。スマホなども含むコンピュータを使う場合、普通に触れているものです。 Windowsならエクスプローラ、macOSならファインダー、UNIX/Linuxならlsコマンドなどを使っていることでしょう。

WordやExcelといった書類も、画像も、プログラムのソースコードも全て、ファイルです。 一般的にファイルを仕分けするための仕組みであるディレクトリ(もしくはフォルダ)と、 ファイルによってデータが格納されています。

ファイルには一部特殊なものがありますが、特殊なことをしない限りは、 ファイルサイズ分のデータが格納されています。

テキストとバイナリー

格納されているデータには、人間が読めるテキストデータと、人間が読めないバイナリーデータがあります。

バイナリー(binary)は、元々二進数という意味ですが、コンピュータでは全てのものを二進数の数字で取り扱っているため、 二進数という言葉が転じて、人間が読めないデータ全般を指します。

テキスト(text)は文字コードという一定のルールによって、人間が読める文字・文字列として解釈できるようになっているデータです。

[column] バイナリーとビット

バイナリーデータは、ビット(binary digit / bit)という 01 の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コンピュータは現代のプログラミングシーンでは力不足だといえるでしょう。

[/column]

文字コード

テキストは、一定のルールに従って、文字やその連なりである文字列として解釈できるデータだと説明しました。

現代であれば文字コードは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ではない符号化方式が一部残されていて、 未だに混乱の元ですが、それらもいずれは駆逐されていくことでしょう。

[column] 符号

ある一定のルールに従って数字や文字に意味をもたせて、なにかを表現するのが符号です。

たとえば、utf-8では、0〜127の数字は、1バイトの0〜127で表現します。128から2047までの数字は2バイト、2048から65535までの数字は3バイトで表現します。

また、文字列の組み合わせから何かしらの形式を作り出すのも符号です。

符号に変換することを符号化と呼びます。元に戻すことを復号と呼びますが、日本語的な理由により復号化とは呼ばないですが、復号化と表現しても問題はないでしょう。たぶん。

[/column]

JSON

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.ageAtDeath26という数字を取得できます。

他の有名な汎用データ形式には、XMLやYAML、MessagePackなどがあります。

現代では、汎用データを保存するときには、JSONを使えば大体問題はありません。XMLは仕様が仰々しすぎて、誰も扱いたくないというのが本音です。

Footnotes

  1. これをグリフ(gryph)と呼びます。様々なフォントデータは、グリフを実際の文字の形状に落とし込んでいます。