採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

ファイルとは / バイナリ vs テキスト / 文字コード

テクノロジ系 / file-io (read / write / CSV / paths / upload概念)

ファイルとは / バイナリ vs テキスト / 文字コード

Lesson 14 / Chapter 1

ファイルって結局なに?

hello.txt  ─┐
            ├─ ファイル名 (= ディスク上の場所を指す目印)
            └─ 中身 = ただのバイト列 (0 と 1 が並んだもの)
  • ファイル = バイト列 + 名前 (パス)
  • ディスク (HDD / SSD) 上に保存されていて、電源を切っても消えない
  • 「変数 ($x) はメモリ、ファイルはディスク」と覚える

→ PHP の役目は ディスク上のバイト列を読み出す / 書き込む

テキストファイル vs バイナリファイル

テキストバイナリ
中身文字 として解釈できるバイト列文字に直すと意味不明
.txt / .csv / .json / .html / .php.png / .jpg / .pdf / .zip / .mp4
エディタで開く読める文字化けする (専用ソフトで開く)
PHP での扱いfile_get_contents で文字列としてfread でバイト数指定して読む

file-io トピックで扱うのは テキスト系のみ (.txt / .csv)。画像・PDF などのバイナリは別トピック。

「文字コード」 = バイトを文字に翻訳するルール

バイト: 0xE3 0x81 0x82
                │
        UTF-8 で解釈
                ▼
              「あ」
  • UTF-8 : 今の標準 (Web も PHP も Mac も Linux も基本これ)
  • Shift_JIS : 古い Windows / Excel 由来 (CSV で時々遭遇)
  • EUC-JP : 古い UNIX 系 (ほぼ歴史的存在)

→ 違う文字コードで開くと 文字化け する。「UTF-8 で揃える」 が file-io トピックのお作法。

改行コード — LF と CRLF

LF   = "\n"     (= 0x0A)         macOS / Linux の標準
CRLF = "\r\n"   (= 0x0D 0x0A)    Windows / 一部の Web プロトコル
場面どっち
PHP の \nLF
php_eol (PHP_EOL 定数)環境依存
HTTP ヘッダCRLF
Excel が吐く CSVCRLF (Windows) / LF (Mac) どちらもあり得る

fgetsCRLF も LF もまとめて読む が、末尾に改行が含まれることに注意 (rtrim($line) で外す)。

PHP からファイルを触る基本パターン

<?php
// 読む (一発)
$text = file_get_contents('/path/to/foo.txt');

// 書く (一発)
file_put_contents('/path/to/foo.txt', "hello\n");

// 1 行ずつ読む (大きなファイル / 行単位処理向き)
$fp = fopen('/path/to/foo.txt', 'r');
while (($line = fgets($fp)) !== false) {
    echo $line;
}
fclose($fp);

「一発で全部 (file_get_contents / file_put_contents)」と「1 行ずつ (fopen + fgets + fclose)」の 2 系統がある、と頭に入れる。

file-io トピックの作法: 読みは固定 / 書きは一時ディレクトリ

// 読み込み: drill 内の固定パスから (リポジトリにコミット済み)
$path = __DIR__ . '/tests/data/hello.txt';
$text = file_get_contents($path);

// 書き込み: OS の一時ディレクトリへ (採点後に消える)
$tmp = tempnam(sys_get_temp_dir(), 'dojo_');
file_put_contents($tmp, "hi\n");
unlink($tmp);  // 後始末
  • __DIR__ = この PHP ファイルがあるディレクトリ。cwd に依存せず安全
  • sys_get_temp_dir() = OS の一時領域 (Mac/Linux なら /tmp)
  • unlink($tmp) で必ず消す。CI で同じ drill を何度回しても汚れない

このチャプターでできるようになること

✅ 「ファイル = バイト列 + 名前」と絵で言える

✅ テキスト / バイナリの違いを 1 行で言える

✅ UTF-8 / Shift_JIS の関係 (文字化けの正体) を言える

✅ LF / CRLF の違いと、PHP では \n (LF) が標準だと知っている

✅ 「読みは固定 / 書きは一時ディレクトリ」という file-io トピックの作法を理解した

関連: ch02 で file_get_contents を使った実際の読み込みを扱う