ファイルとは / バイナリ 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 の \n | LF |
php_eol (PHP_EOL 定数) | 環境依存 |
| HTTP ヘッダ | CRLF |
| Excel が吐く CSV | CRLF (Windows) / LF (Mac) どちらもあり得る |
fgets は CRLF も 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 を使った実際の読み込みを扱う