2018年12月14日金曜日

文字コード変換はコマンド一発で解決!



こんにちは。よっしーです。

今日は文字コードについてのお話しをしたいと思います。


今まで、いろいろなプロジェクトに携わってきましたが、

開発環境、実行環境などによって、ソースファイルの文字コードが決まっており、

開発者が文字コードを「意識する」という場面がよくあります。


使用するテキストエディタ、ツール等によるところがありますが、

新規作成したソースファイルを保存する際、デフォルトの文字コードが決まっており、

そのデフォルトの文字コードが、期待する文字コードになっていないと、

知らず知らずのうちに、プロジェクトに沿わない文字コードで

ソースファイルを生成してしまうこととなります。


チームで開発をしていると、ソースファイルを集約したときに、

ファイル毎に文字コードがばらばら。。。なんてことも、よくありますよね。


で、そういったとき、ソースファイルの文字コードを正しいものに「変換」するのですが、

Windows でいろいろと文字コード変換ツールを使ってはみたものの、

あまりしっくりくるものがなく、いろいろと試した結果、Linuxコマンドを

使用して変換する。というスタイルに落ち着きました。


なので、今回は文字コード変換の方法についてご紹介したいと思います。

(例のごとく、Ubuntu環境でのやり方となります)




はじめに、nkf というコマンドを使用しますので、インストールします。

nkf コマンドをインストール
$ apt-get install nkf


あとは、いろいろなコマンドとを組み合わせて使います。

まずは、現在のファイルがどのような文字コードになっているかを確認してみましょう。


複数ファイルの文字コードをコマンド一発で確認
$ find . -type f | xargs nkf --guess | column -s: -t

出力結果
↓ファイル文字コード
./inc/client_recv.hUTF-8 (BOM) (LF)
./inc/client_send.hUTF-8 (BOM) (LF)
./inc/main.h       UTF-8 (BOM) (CRLF)
./inc/svc_recv.h   Shift_JIS (CRLF)
./inc/svc_send.h   Shift_JIS (CRLF)
./src/client_recv.cUTF-8 (LF)
./src/client_send.cUTF-8 (LF)
./src/main.c       UTF-8 (BOM) (CRLF)
./src/svc_recv.c   Shift_JIS (CRLF)
./src/svc_send.c   Shift_JIS (CRLF)

ファイルによって文字コードや改行コードがバラバラですね。。。


で、これを1つの文字コードに統一するため、変換をかけます。

複数ファイルの文字コードをコマンド一発で変換

※ Shift-JIS、改行コード=CR+LF にする場合
$ find . -type f | xargs nkf --overwrite -s -Lw

※ UTF-8、改行コード=LF にする場合
$ find . -type f | xargs nkf --overwrite --oc=UTF-8 -Lu

※ UTF-8(BOM付)、改行コード=LF にする場合
find . -type f | xargs nkf --overwrite --oc=UTF-8-BOM -Lu



UTF-8、改行コード=LF の変換をかけた後、文字コード確認をしてみると、、、

出力結果
./src/client_recv.cUTF-8 (LF)
./src/client_send.cUTF-8 (LF)
./src/main.c       UTF-8 (LF)
./src/svc_recv.c   UTF-8 (LF)
./src/svc_send.c   UTF-8 (LF)
./inc/client_recv.hUTF-8 (LF)
./inc/client_send.hUTF-8 (LF)
./inc/main.h       UTF-8 (LF)
./inc/svc_recv.h   UTF-8 (LF)
./inc/svc_send.h   UTF-8 (LF)
キレイに文字コードがそろってますね!


ファイルをテキストエディタで開いて、文字コードを指定し保存する。

というやり方でもよいですが、ファイルの数が多くなってくると、

かなり手間になってしまうので、そんな時はコマンド一発で一気にやってしまいましょう!


ではまた~。

0 件のコメント:

コメントを投稿