テキストファイル。世界中のプログラマすべてが使う、必須のファイル形式。
単純そうに見えるテキストファイルですが、実は知らないとトラブル起きることが意外とあります。知識として知っておきましょう。
テキストファイルとは?
テキストファイルとは、文字データだけで構成されるファイルです。最大のメリットは、人の目で見て分かること。
反対は「バイナリファイル」。画像ファイルとかプログラム実行ファイルですね。
そもそも「ファイル」とは?
ファイルとは、数字の並びを記録したもの。
こんなテキストファイルがあるとします。
Hello
中身を見てみましょう。
赤枠が、ファイルの中身です。
48,65,6C…が、それぞれひとうの数値です(16進数で表示)。ここでは5個の数字が並んでいます。
この1個1個の領域が、バイトです。このファイルのサイズは5バイト、ということですね。
1つのバイトには、00~FFの数字が入ります。10進数でいえば、0~255 の範囲です。
バイナリ表示で中身を確認
ちなみに、うえのような感じで表示することを、業界用語で「バイナリで表示する」といいます。
「これバイナリ表示したらどうなるの?」とか言われても、うろたえないようにしましょう。
なお本記事のバイナリ表示は、Windows PowerShell の Format-Hex コマンドで出力しています。
文字を表す数値、文字コード
ASCIIコードで文字を数値に
文字が5個でサイズが5バイト、1つのバイトが1つの文字を表していそうですね。
この、文字と数字の対応(=文字コード)の決まりが、ASCIIコードです。読みは「アスキーコード」。
ASCIIコードでは、”A”→65、”1”→49、”%”→37、といった具合の対応が決められています。
日本語は1バイトで表現できない
ASCIIでは、1バイトの数字と対応しています。1バイトは0~255までしかありません。
じゃあ1,000文字以上ある日本語の場合はどうなるの?
こんなテキストファイルならどうでしょう。
こんにちは
中身をみてみます。
なんか増えた。数えると、15バイトあります。
察しはつきますね。日本語の場合は、複数のバイトで1文字を表現するのです。
うえの例だと、3バイトで1つの文字。
日本語文字コードはUTF-8で
では日本語の場合の文字コードは?
やっかいなことに、日本語の文字コードは複数の規格があるのです。
代表的なもので、Shift-JIS、EUC、UTF-16、UTF-8…。同じ「こ」という文字でも、文字コードによりあらわされる数字が違います。
ただ、いまの時代、選択すべき日本語文字コードは、 UTF-8 一択です。他はまず使いません。
問題なのは、かつてWindowsでは、Shift-JISが標準文字コードだったということです。
対してLinuxの標準はUTF-8です。なのでWindowsで編集したテキストファイルをLinuxで見ると、文字化けします。文字化けとは、テキストを違う文字コードとみなして読んでしまったときに発生します。
最近ではWindowsも UTF-8 が標準となってきたので、問題は起こりにくくなっています。
BOMはいらない
たまに、「BOM付き」「BOM無し」という言葉を、聞くことがあるかもしれません。メモ帳の保存オプションにもあったりします。
こんにちはファイルを、BOM付きで保存した結果
BOM付きの場合、先頭に3つの数字が追加されます。
詳しくはしらなくてよいです。これだけ覚えてください。
BOMはいりません。必ず、BOMなしUTF-8 で保存してください。
空白にもいろいろある
つぎは空白の話です。
半角スペースと全角スペース
キーボードの一番下の長いキーのやつ。「スペース」あるいは「ホワイトスペース」とも言われます。
スペースには、「半角スペース」と「全角スペース」があります。半角スペースは英語入力のとき、全角スペースは日本語入力のときに入力できます。
全角スペースと半角スペースは、文字コードが明確に違います。例でみましょう。
半角スペース
Hello World
全角スペース
Hello World
全角スペースだと、3バイトに増えましたね。
大事なのはただひとつ、プログラミングでは全角スペースを使うな、です。
スペースはいろいろな区切り文字として使います。プログラムコードを書くとき、データをテキストファイルに出力するとき…。
人が見て空白に見えたとしても、コンピューターは、全角スペースを空白とみなしません。
特別な理由がない限り、スペースは必ず半角にしましょう。
タブとスペース
空白について、プログラマーにはもうひとつ、タブかスペースか問題があります。
プログラムコードを書く時の、字下げ(インデント)を、タブとするかスペースとするか。
例えば以下のC言語コード、途中で4文字分や8文字分の空白があるところ、がインデント。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int target, guess, attempts = 0;
srand(time(NULL));
target = rand() % 100 + 1; // 1から100までのランダムな数を生成
printf("1から100までの数を当ててください!\n");
do {
printf("予想を入力してください: ");
scanf("%d", &guess);
attempts++;
if (guess > target) {
printf("もっと小さい数です\n");
} else if (guess < target) {
printf("もっと大きい数です\n");
} else {
printf("正解です!\n");
printf("正解までの試行回数: %d\n", attempts);
}
} while (guess != target);
return 0;
}
インデントはタブかスペースか、これはプログラムを書くときの規約によるので、その規約に従いましょう。
ただ現在の主流は、スペースによるインデントです。「2文字分」か「4文字分」かという違いがあったりしますが。
なお、VisualStudioCodeなどの最近のプログラミングエディタには、たいていタブスペース相互変換の機能がついています。間違えたとしても簡単に直せます。
なかなかやっかい、改行コード
次は、問題の多い改行コードの話です。
改行コードとは
以下の2つのテキストファイル、中身はどう違うでしょうか?
HelloWorld
Hello
World
みてみましょう
2段に分かれているほうは、0D 0A が追加されました。これが改行コードです。
0Dも0Aも、普通の文字ではない、制御コードです。それぞれ次のように呼ばれます。
- 0D:キャリッジリターン。CarriageReturn:CR、文字であらわすと\r
- 0A:ラインフィード。LineFeed:LF、文字であらわすと\n
意味はとくに知らなくてもよいです。この2文字の改行コードを、CRLF と呼んでいます。
Windows、Mac、Linux の違い
さて、上の話は、Windowsのメモ帳で書いたときの話です。これがLinuxやMacだと、話が違ってきます。
以下は、Linux の Vim で保存した時の内容です。
Linuxでは、改行コードが0A、つまりLFのひとつだけになっています。
同じ改行でも、WindowsではCRLF、MacやLinuxではLFとなってしまう。これが改行コード問題です。
例えば、
- Linuxサーバから、自分のWindowsPCにテキストデータファイルを持ってくる
- メモ帳で編集する
- Linuxサーバに再度アップする
とすると、
改行コード変わってるじゃないかーーーーー!
といった問題が起こったりします。※注:現在のメモ帳は改行コードを保持します。
ちなみにWindowsでも、フリーのテキストエディタなどでは、改行コードの指定ができます。
例えばサクラエディタなら、保存時に改行コードが指定できます。
※注:昔のMacは改行コードCRでした。いまはiOSがLinuxベースなのでLinuxと同じです
ところがWindows標準のメモ帳だと、普通に保存するとCRLFになります。
なのでメモ帳で編集していたりすると、
プログラミングでメモ帳を使うなぁーーーーー!
と怒られます。できるだけ、有能なテキストエディター使いましょう。Visual Studio Codeおすすめです。
まとめ
テキストファイルの話は、プログラミングに慣れると、自然に身についてきます。
でも初めは分からないですよね。
なにかトラブルが起きた時に参考にしてみてください。
コメント