今回は前回説明したtextutilを使って文字コードを変換します。macOSにはもう1つ文字コードを変換するiconvがありますので、合わせて説明します。なお、文字コードは大変に複雑・面倒なので怪しい説明になっている面もあるかもしれません。また、機種・OS固有の文字コードの問題に加えてアプリケーション側での問題もあります。説明が怪しいなと疑問に思われた方はWebで調べてみてください。
今回もこれまでのようにサンプルで利用するファイル・ディレクトリはデスクトップのsampleディレクトリとしています。デスクトップにsampleディレクトリがない場合は作成しておいてください。(コマンド入力ならmkdir ~/Desktop/sampleとして作成することができます)
また、カレントディレクトリも上記の場所になります。cd ~/Desktop/sampleのようにコマンドを入力してカレントディレクトリを変更しておけばよいでしょう。
textutilで文字コードを変換する
それではtextutilを使って文字コードの変換を行ってみましょう。文字コードを変換するツール・コマンドとしてはnkfが有名ですが、Macではiconvコマンドが用意されているので、そちらを使った方が楽でしょう。iconvがあるのになぜtextutilで?という人もいるでしょう。そこはそれ、ワード文書などに直接変換できるということで許してください。iconvについては後ほど説明します。
その前に「文字コードって何?」という人もいるかもしれません。すでにUTF-8がスタンダードになって相当の年数が経過し絵文字も使えるようになったので、文字コードに悩まされることは、かなり減ったのではないかと思います。UTF-8以外の文字コードで多く使われたのは日本国内ではWindowsやPC-9801や古いMacで使われていたShift JISがあります。機種ごとに微妙に空き領域で使用している文字コードが異なります。次にUNIX系で使われていたEUC(EUC-JP)です。古いUNIX系の文書ではEUCの文字コードとなっている場合もあります。他にはJISなどの文字コードもあります。
文字コードに応じて処理できない場合は文字化けが発生することがあります。使用しているエディタやアプリケーションにもよりますが、古くからの慣れた人(?)であれば、どう文字化けしているかによって、ある程度文字コードを推測することができるでしょう。
ここではShift JISの文字コードを使ったファイルとして1sjis.txtを、EUC-JPの文字コードを使ったファイルとして2euc.txtを用意しました。中身は、この連載の先頭部分です。
textutilでは-inputencodingの後に変換前のエンコーディング名を、-encodingの後に変換後のエンコーディング名を指定します。指定できるエンコーディング名は以下のサイトで確認してください。なお、以下のページには記載がありませんが、Shift JISはSJISのように省略して指定できます。
・IANA Character Sets
https://www.iana.org/assignments/character-sets/character-sets.xhtml
それでは1sjis.txtをUTF-8の文字コードに変換して5.txtというファイル名で保存してみましょう。この場合、以下のように指定します。
textutil -inputencoding Shift_JIS -convert txt 1sjis.txt -encoding UTF-8 -output 5.txt
無事に変換されると5.txtが生成されます。catコマンドで内容を確認すると1sjis.txtとは異なり文字化けせずに表示されているのがわかります。
同様に2euc.txtはEUC-JPの文字コード名を指定すれば変換できます。
textutil -inputencoding EUC-JP -convert txt 2euc.txt -encoding UTF-8 -output 6.txt
iconvで文字コードを変換
せっかくなのでおまけでiconvを使った場合の文字コード変換例も説明しておきます。なお、OSのバージョンによってはiconvで期待通りに文字が変換されないことがあります。正規化されてると思ったら正規化されていなくて正気か?みたいなことがあるので注意してください。人名や地名などを変換する場合は要注意です。
まず、Shift JISコードの1sjis.txtファイルをUTF-8コードの5.txtに変換する場合は以下のようになります。-fの後に変換前の文字コードを、-tの後に変換後の文字コードを指定します。変換したテキストは標準出力に流されるのでリダイレクトを使ってファイルに保存します。
iconv -f SJIS -t UTF-8 1sjis.txt >5.txt
次にEUC-JPの文字コードの2euc.txtをUTF-8コードの6.txtに変換する場合は以下のようになります。
iconv -f EUC-JP -t UTF-8 2euc.txt >6.txt
ちなみにiconvで変換できるエンコードの種類はiconv -lとすると表示されます。
この対応した文字コードの中で見慣れないUTF-8-MAC UTF8-MACというものがあります。
iconvでも以下のように指定してUTF-8-MACからUTF-8などの文字コードに変換できます。
iconv -f UTF-8-MAC -t UTF-8 input.txt
この見慣れないUTF-8-MACですが、Googleでこのキーワードを入れて検索するといろいろ出てきます。いろいろ問題はあるようですが、目立つ物としてはMacではアプリケーションによって濁点が分離してしまったりするようです。例えば以下のような4文字があったとします。
ガルパン
これは普通に見ると日本語のカタカナ4文字です。ところがMacでは以下のように濁点等が分離しているので6文字扱いになってしまいます。(ちょうどいい文字がないので以下の表示は、それらしいイメージとして提示しています)
カ”ルハ。ン
ここで困るのは内部では分離しているのにFinderなどでは「カ"」は「ガ」に変換されて表示されているということです。
つまり見た目には同じ文字が表示されているので文字列検索・ファイル名検索しているのに、なぜかヒットしない(検索結果に出てこない)ということになります。ここらへんはなかなか難しくて一筋縄ではいかないところです。WindowsからMacへ持ってくる場合は不具合は少なそうですが、逆はかなり不具合が発生することがあります。そればかりか古いMacから最新のMacにファイルをコピーするだけでも、ファイル名に不具合が発生することもあります。(10.6→11.6など)