【意外とトラブル】プログラマー必修「テキストファイル」の基礎知識

textfile

テキストファイル。世界中のプログラマすべてが使う、必須のファイル形式。

単純そうに見えるテキストファイルですが、実は知らないとトラブル起きることが意外とあります。知識として知っておきましょう。

目次

テキストファイルとは?

テキストファイルとは、文字データだけで構成されるファイルです。最大のメリットは、人の目で見て分かること

反対は「バイナリファイル」。画像ファイルとかプログラム実行ファイルですね。

そもそも「ファイル」とは?

ファイルとは、数字の並びを記録したもの。

こんなテキストファイルがあるとします。

テキストファイル

Hello

中身を見てみましょう。

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付きファイルの中身

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などの最近のプログラミングエディタには、たいていタブスペース相互変換の機能がついています。間違えたとしても簡単に直せます。

VSCodeのタブスペース変換

なかなかやっかい、改行コード

次は、問題の多い改行コードの話です。

改行コードとは

以下の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で保存したテキストファイル

Linuxでは、改行コードが0A、つまりLFのひとつだけになっています。

同じ改行でも、WindowsではCRLF、MacやLinuxではLFとなってしまう。これが改行コード問題です。

例えば、

  • Linuxサーバから、自分のWindowsPCにテキストデータファイルを持ってくる
  • メモ帳で編集する
  • Linuxサーバに再度アップする

とすると、

ベテランさん

改行コード変わってるじゃないかーーーーー!

といった問題が起こったりします。※注:現在のメモ帳は改行コードを保持します。

ちなみにWindowsでも、フリーのテキストエディタなどでは、改行コードの指定ができます。

例えばサクラエディタなら、保存時に改行コードが指定できます。

サクラエディタの改行コード変換

※注:昔のMacは改行コードCRでした。いまはiOSがLinuxベースなのでLinuxと同じです

ところがWindows標準のメモ帳だと、普通に保存するとCRLFになります。

なのでメモ帳で編集していたりすると、

ベテランさん

プログラミングでメモ帳を使うなぁーーーーー!

と怒られます。できるだけ、有能なテキストエディター使いましょう。Visual Studio Codeおすすめです。

まとめ

テキストファイルの話は、プログラミングに慣れると、自然に身についてきます。

でも初めは分からないですよね。

なにかトラブルが起きた時に参考にしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次