Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

改行コードのこと

研究内容

WindowsとLinuxの改行コードの違い。これ、初めてPerl/CGIに 取り組んだときに分からなくて大変でした…。しっかり理解しておかないとエラーが出たときに 原因が分からなくてホント困ります。しっかり研究しておきましょう。

結果

改行コードとは

改行コードというのは、テキストファイルの1行の終わりに 付いている「これで行が終わりですよ、次の行に なりますよ」という文字のことです。いや、文字というと変ですね。 データというのが正しいでしょうか。

もともと文字というのは半角文字の場合1バイト、全角文字の場合2バイトです。 バイトというのはデータの単位で、1バイトで0〜255の間の数字を表すことができます。 例えば、'A'という文字。これは半角のAなのですが、これが1バイト。で、数字としては 65です。'A'の正体は65!そんで'B'は66。1つの値は1つの文字に対応していて、 メモ帳などのテキストエディタは人間に分かるようにこの数字を文字にして画面に表示してくれます。 そんなワケで、1バイトのデータというのは0〜255の値を持ちますから、0を入れて256種類の文字を 表すことができるわけです。全角文字が2バイトなのは、1バイトじゃ数が足りないからですね。 2バイトだと65536種類の文字を表すことができます。

さて1バイトで表される256種類の文字ですが、 これが全部、人間が読める文字というワケではありません。一部、制御コードと呼ばれる 特殊な文字があります。その中の1つが、目に見えない改行というコードなんです。 改行コードがあると、パソコンはそれを行の終わりだと認識して、画面に表示するときに 次の行に移ってくれるのです。

WindowsとLinuxの改行コードの違い

さてこの改行コード、パソコン(Windows)の場合、2バイトです。 実際のデータは数字で書くと 13 10 です。これが改行コードの正体ですね。 パソコンは、 13 10 という2つの並んだ値を改行として認識するわけです。 目には見えませんが、行の終わりと次の行の始まりの間にこういうデータが挟まっているんですね。 一方、パソコン以外の多くのサーバーはLinuxというOSを使っていますが、 こちらは改行コードが1バイトの 10 なのです

なんで同じ改行なのに違うのかというのはたぶん歴史的なものだったんでしょう。 パソコンの 13 10 という2つのコードは、2つで1つの意味を持っていたわけではなくて、 13 が「行の先頭に戻る」そして 10 が「位置はそのままで下の行に移る」という意味なんだそうです。 改行ということをこのように2つのこととして考えているんですね、パソコンは。 でも、この2つはいつも一緒です。 パソコンで単に 10 とした場合は、改行ではなく下の行に移ることを意味してるはずですが、 メモ帳などは、単に 10 としても下の行には移ってくれなかったりします。 とにかく 13 10 はいつもセットなんですね。 パソコンではこれがバラバラに使われることはまずありません。 一方、Linuxでは「改行するのに毎回2バイト使ったら面倒だし無駄じゃん?10だけでいいじゃん?」という ことで(想像)、改行はシンプルに 10 なんですね。

問題発生!

さてここで問題が起こります。パソコンで作ったテキストファイルはそのままLinuxに持っていくと 変なことが起こるのです!Linuxは 10 を改行として考えますから、行の終わりに 13 10 というWindowsの改行コードがあったとき、 13 を行の最後にくっつけたまま、10 のところで改行します。 13 が残っちゃうのです。 そしてこの 13、目には見えません。 目には見えないのに 13 という意味のないデータが行末にくっついてる状態。 この状態だと、いろ〜んな問題が起こるんです!

Perl/CGIについては、なにが起こるかというと、凄くシンプル…。 いくら頑張っても、他の全てが正しくても、エラーになって実行することが出来ません! ですから、凄く重要です。めっさ重要なのです。 この 13、目に見えないから、いくら調べても見つからなくて本当に参ってしまったりします…。 管理人、この目に見えない 13 のおかげでかつて大変な思いをしたことがありまして、 ほんと、その時はサーバーの管理者まで巻き込んで、CGIがどうやっても動かない! どうしてだあー!と騒いだりしました…すいませんでした。

問題解決の唯一の方法、忘れちゃいけません

それじゃどうしたらいいのか?ってことなんですが、パソコンからサーバーにファイルを転送する ときってFTPっていうのをしますよね。このFTPをするときに、自動的に 13 10 を 10 に変えてもらうんです。 FTPをしてくれるツールはいろいろありますが、「テキストモード」「バイナリモード」の 2種類のモードがあるのが普通です。テキストファイルの場合はテキストモードでFTPする! そうすると、自動的に 13 10 を 10 に変えてくれます。 バイナリモードになっていると、13 10 がそのままになっちゃいます。 テキストファイルはテキストモードでFTPする!これを忘れちゃいけません。

これで全ては丸く収まります。 無事、パソコンで作ったテキストファイルがサーバー上でも正しく扱えるように なります。良かった…。実際はFTPするときテキストモードで送るっていうだけのことなんですが、 いやーたったそれだけのことなのに、長々と書いてしまいました。 でもこれだけ書けば管理人のしょぼい脳味噌にもしっかりインプットされて、 今度同じミスをしてエラーになったときに「改行コードが原因かな?」と気がつけるようになる… といいなぁ。

分かったこと

  1. 改行コードはWindowsは2バイト、Linuxは1バイトです。
  2. Windowsの改行コードはLinux上でいろんな問題を引き起こす原因になります。
  3. 改行コードの違いを吸収するために、テキストファイルは必ずテキストモードで FTPするようにしましょう。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。