2019年11月10日更新
Linuxでファイルの改行コード/文字コードを確認・変換する方法
LinuxとWindows、またはMacとで各種データをやり取りする場合に問題になるのが、文字コードや改行コードの違いです。本記事では、Linuxのコマンドを利用して、文字コードや改行コードを確認・変換する方法をお伝えします。
目次
Linuxでファイルの改行コードを確認・変換する方法
PCで使われる文字コードや改行コードは、機種やOS、アプリによって異なります。そのため、Windowsで作成した文書をLinuxで開くと文字化けしたり、改行がおかしくなったりすることが少なくありません。もちろん逆の場合も同じことが起こります。そこで本記事では、データで使われている文字コードや改行コードを確認し、変換する方法をお教えします。
そこでこの章では、まずはファイルの改行コードを確認する方法と、それを変換する方法をお伝えします。
WindowsなどOSごとに改行コードは異なる
ファイル中の改行コードは、元々は電気式の通信用タイプライターであるテレタイプを接続して印刷する際の改行のコマンドでした。タイプライターでは、改行の際に、
- 活字をタイプするヘッド部分を行の先頭部分に戻す……Carriage Return。CRと略す。Carriageはタイプライターヘッドのこと
- 行1行分タイプ用紙を送る……Line Feed。LFと略す
というふたつの作業を行います。そのため、テレタイプに「CR+LF」のコードを送ると、テレタイプ上では改行が行われました。しかし、その後文字出力がディスプレイに移行したことで、改行コードは必ずしも「CR+LF」ではなくなります。
OSごとの改行コード
現状、改行コードには以下の3つのパターンがあります。
- CR+LF……Windows
- LF…………UNIX・Linux・macOS
- CR…………Mac OS Xになる前のMac
そのため、WindowsのファイルをLinuxでそのまま扱うと、改行部分が2重になったり、おかしな表示になったりします。
使用されている改行コードを調べられるコマンド
Linuxで改行コードを調べるには、nkfやcatなどいくつかのコマンドが利用できます。以下の項では、Linuxでそれぞれのコマンドを利用して「text.txt」の改行コードを調べる例を挙げます。
nkfコマンド
文字コードと改行コードを変換するLinuxのnkfコマンドで改行コードを調べる場合、「nkf -g text.txt」とすると、次の章で紹介する文字コード表示の後に、以下のように改行コードが表示されます。
- UTF-8 (LF)………改行コードはLF
- Shift_JIS (CR)……改行コードはCR+LF
- UTF-8 (CR)………改行コードはCR
catコマンド
テキストファイルの中身を表示するLinuxのcatコマンドで改行コードを調べる場合、「cat -e text.txt」とすると、catでファイルの内容が表示される際に、行末に改行コードが記されます。catで-eオプションを使った場合、改行コードは以下のように表示されます。
$…………改行コードはLF
^M$……改行コードはCR+LF
^M………改行コードはCR
fileコマンド
ファイルの種類を調べるLinuxのfileコマンドで改行コードを調べる場合、「file text.txt」とすると以下のように表示されます。
- text.txt: ASCII text……………………………………………改行コードはLF
- text.txt: ASCII text, with CRLF line terminators……改行コードはCR+LF
- text.txt: ASCII text, with CR line terminators………改行コードはCR
odコマンド
ダンプコードを表示するLinuxのodコマンドで改行コードを調べる場合、「od -c text.txt」とすると、ファイルの内容がASCIIコードで表示されますので、行末の改行コードが以下のように表示されます。
\n………改行コードはLF
\r\n……改行コードはCR+LF
\r………改行コードはCR
改行コードを変換できるコマンド
Linuxで改行コードを調べるだけでなく変換するには、やはりnkfなどのコマンドを利用できます。以下の項では、Linuxでそれぞれのコマンドを利用して、改行コードがWindowsのCR+LFの「text.txt」を、Linuxの改行コードLFの「text_lf.txt」に変換する例を挙げます。
nkfコマンド
文字コードと改行コードを変換するnkfコマンドで改行コードを変換する場合は、改行コードをLFに変更する「-d」オプションを使って、
- nkf -d text.txt > text_lf.txt
とします。「nkf -g text_lf.txt」や「cat -e text_lf.txt」で変換結果を確認できます。なお、改行コードをCR+LFにしたい場合には「-c」オプションを使います。
trコマンド
テキストファイルの文字を置換するtrコマンドで改行コードを変換する場合は、削除オプションの「-d」を使ってCR+LFのCR(\r)を削除します。
- tr -d \\r < text.txt > telt_lf.txt
こちらも「nkf -g text_lf.txt」や「cat -e text_lf.txt」で変換結果を確認できます。
sedコマンド
ストリームエディタのsedコマンドで改行コードを変換する場合は、「s」コマンドを使ってCR+LFのCR(\r)をnullに置換、つまり削除します。
- sed 's/\r//g' text.txt > telt_lf.txt
こちらも「nkf -g text_lf.txt」や「cat -e text_lf.txt」で変換結果を確認できます。なお、逆にLinuxのファイルをWindows用に変換する場合には、行末にCR(\r)を付加すればいいので、「sed 's/$/\r/g' telt_lf.txt > text.txt」とします。
dos2unix・unix2dosコマンド
改行コードを変換するコマンドには、そのものずばりdos2unix・unix2dosというコマンドもあります。「dos」はWindowsの前身であるMS-DOSを意味し、「2」は「to」を表します。つまり、dos2unixはWindows用ファイルの改行コードをLinux用に、unix2dosはLinux用ファイルの改行コードをWindows用に、それぞれ変換することを意味します。
いずれもコマンドの直後にファイル名を指定することで、元のファイルの内容が上書きされます。
Linuxでファイルの文字コードを確認・変換する方法
LinuxでWindowsの日本語混じりのファイルを扱う場合には、文字コードも問題となります。一般に、
- Windows……Shift JIS
- Linux…………UTF-8
が使われているため、改行コードだけでなく文字コードも変換する必要があります。
使用されている文字コードを調べるコマンド
文字コードを確認するには、改行コードの章でも紹介したnkfを使うのがベストです。nkfは、Network Kanji Filterの名の通り、日本で開発された文字コードの変換に特化したコマンドですので、この手の作業には最適なコマンドなのです。前章で紹介した「-g」オプションを使うと、以下のように文字コードが表示されます。
- UTF-8…………文字コードはUTF-8
- Shift_JIS……文字コードはShift-JIS
- EUC-JP………文字コードはEUC-JP
文字コードの変換コマンド
nkfは文字コードを調べるだけでなく、変換にも利用できます。「-w」オプションを使えば、元のファイルの文字コードを自動判別してUTF-8に変換します。
- nkf -w text.txt > text_utf8.txt
Shift-JISからUTF-8に変換
先に記したように、自動判別してくれるとはいうものの、判別が間違えてしまうこともあるので、元のファイルがShift-JISであると明確にわかっている時には、そのことを明示した「-S」オプションを併用するほうが間違いありません。
- nkf -Sw text.txt > text_utf8.txt
EUC-JPからUTF-8に変換
同様に元のファイルがEUC-JPであると明確にわかっている時には、そのことを明示した「-E」オプションを併用したほうがいいでしょう。
- nkf -Ew text.txt > text_utf8.txt
Linuxの改行コードにメモ帳が対応!
ここまでは主にWindowsで作成したファイルをLinuxで開くときの問題について説明してきましたが、逆にLinuxで作成したファイルをLinuxで開く時にも、問題が発生します。Linuxで作成したファイルは、改行コードとしてLFしかないため、Windows上では改行されていないテキストとして、すべての文字が一行で表示されてしまいがちです。
改行コードを認識してテキストを表示
しかし、2018年の中頃からメモ帳では「LF」のみでも改行として認識するようになりました。これにより、Linuxで作成されたテキストファイルでも(英文であれば)メモ帳では問題なく改行されて表示されるようになったのです。
サポートの詳細
ただし、メモ帳で新規作成されたファイルは、相変わらず改行コードとして「CR+LF」を利用しますし、文字コードはShift-JISのままです。
この変更は、あくまでもLinuxで作成された英文テキストファイルの改行についてのみの対応であり、またWindowsのメモ帳で作成されたテキストファイルをLinuxで読む際には依然として文字コードと改行コードの変換が必要であることは忘れないでください。
改行・文字コードをLinuxのものに変換しよう!
WindowsやMac、あるいは古いUNIXのテキストファイルをLinuxで読む時には、文字コードや改行コードに問題が生じることが少なくありません。そんなときには、本記事で紹介したコマンド、特に「nkf -w」でUTF-8(LF)に変換してしまうのがベストです。なお稀に認識ミスがあるので元のファイルを上書きしないようにすることをおすすめします。