文字コードと改行コードに気をつけようというお話。

この記事は「新人/若手向け、これだけは知っとけTips25 Advent Calendar 2012」の12/5の記事として書いています。
若手のメンバと一緒に仕事をする中で、よく問題となり、その都度教えることがあります。
それは文字コードと改行コードに関する問題です。

想定する環境

想定している環境は、開発現場によくある環境だと思いますが、以下のようなものです。

  • 開発は業務マシンであるWindowsPCを使っている。
  • サーバマシンはLinuxを使っている。
  • 構成管理ツール(Subversionなど)は業務マシンから利用する。

さて、どのような問題が発生するのか?

このような環境で作業しているときによく発生するのが、構成管理ツールにコミットされているファイルとサーバマシン上のファイルが同じファイルのはずなのに、差分チェックをすると差分がでるというものです。

このようなこと周囲でよくありませんか?
※差分チェックツール側で改行コードの違いを無視する設定にしていると差分がでないのでこれも注意です。

なんでそうなるの?

なぜこような問題が発生するのか?と実際に作業しているメンバの作業のやり方を、横について一緒に確認すると、実は皆同じことが原因であることが分かります。

そう、若手のメンバの多くが、利用しているファイル転送ツール(WinSCPFFFTPEclipseリポジトリツールなど)が自動的に文字コードや改行コードを変換してしまうということを知らないままに作業しているということです。

ファイル転送ツールが自動的に文字コード、改行コードを自動変換してしまう

これは、ツールとしては便利な機能としてほとんどのツールが備えている機能です。実際にどういうことかと説明すると以下のようなものです。

  • サーバマシンであるLinux上に文字コードEUCで、改行コードがLFの設定ファイルがある。
  • このファイルをWinSCPで開発用の業務マシンにダウンロードしてくると、文字コードがShift-JISで改行コードがCR+LFに変換される。
  • この変換がかかっていることに気づかずに構成管理にコミットする。

このような流れで問題が発生します。

ではどうすればよいか?

基本的に上記の自動変換は転送モードを「textモード」にしていることで発生します。textモードはファイルの拡張子を判断して自動的に変換してくれるのですが、さらにこのモードがデフォルトであることが多いため、気づかずに問題が発生してしまいます。

この自動変換をしないためには「binaryモード」を指定してファイル転送を行うことで、このような自動変換が行われないようにすることができます。
(以下はWinSCPの例)

また、このファイル転送モードの指定は、デフォルト設定を変更できる機能が通常はあるので、毎回指定することが面倒であれば、その設定をすることをオススメします。
(以下はWinSCPの例)

ちなみに、デフォルトに設定したとしても、毎回モードがbinaryであることを確認することはクセとしてつけておいた方がよいでしょう。

一つの疑問

ツールが自動変換をダウンロード時、アップロード時に正しく実施してくれれば、矛盾は起きないのではないか?という疑問を持つメンバがいるかもしれません。

そのようなメンバに知っておいてほしいことは、確かに矛盾は発生しないが、ツールによってファイルが自動的に変換されていることが問題である、ということです。

サーバ側で試験を行い、これで確認が取れたのでリリースファイルとする、という際には、その確認が取れたファイルをそのまま使うことが大切です。しかし、ファイル転送ツールによってこのファイル変換が発生すると、確認をとったファイルとダウンロード、アップロードしたファイルは異なるファイルになります。なので、基本的にこのような変換が発生することは避けるべき、という点を理解しておきましょう。

もひとつ

さらに知っておいた方が良いことは、サーバ上のファイルを所有者や権限情報も含めて保持したい場合は、tarやzipなどで固めた上で、binary取得するとよいです。

さらに、もひとつ

最近のサーバではUnicodeに対応しており、ファイル名に日本語や空白を使っても問題なく処理できます。しかし、日本語や空白を含むファイル名はツールやコマンドによっては正しく処理できない、という問題が発生するため、より安全に作業するには英数字や記号などをファイル名に使うとよいです。

終わりに

なんか、小言のような細かい話ではありますが、現場ではよく発生する問題であり、経験あるエンジニアは過去の経験から暗黙的にこのような問題を回避するような作業グセがついているものです。ぜひ、役立てて頂けると幸いです。