最近は少なくなったように思うが、以前はテキストファイルの中身を確認できないことがしばしばあった。これは、ログイン環境に設定されているエンコーディングと違うエンコーディングのデータであることが原因だ。日本であればWindowsはCP932、macOSであればUTF-8、Linuxも最新のディストリビューションのほとんどはUTF-8を使っているだろう。つまり、何も考えずにWindowsで作成したテキストファイルをmacOSやLinuxで閲覧しようとすると、次のように文字化けすることになる。

エンコーディングが違うと文字化けする

最近だと、Webブラウザで保存したHTMLテキストファイルの中身をページャで表示することができないとか、そういったケースが多いように思う。Webページのエンコーディングはさまざまなので、システムのデフォルトエンコーディングと違っていると表示できないことがあるのだ。賢いモダンエディタを使っていれば表示できないことはあまりないが、ターミナルで見ようとするとダメ、というケースはあるだろう。

データのエンコーディングを判断して自動的に変換するタイプのページャを使っていればエンコーディングが違っていても自動的に処理してくれる。だが、そうした機能を持たないデフォルトのページャを使っていると、やはり次のように文字化けしてしまう。

エンコーディングが違うと、ページャでも文字化けする

こうした場合に使えるコマンドがiconvコマンドだ。iconvは、アプリケーションからエンコーディング変換を行うためのライブラリとしても使われることが多く、ほとんどのディストリビューションでiconvのライブラリとコマンドが利用できる。

このiconvコマンドで主に使うオプションは、「-t」と「-f」だ。-tオプションにデータのエンコーディングを指定し、-fオプションに変換後のエンコーディングを指定する。例えば、次のように指定して実行するとCP932のテキストファイルをUTF-8に変換することができる。

この環境のエンコーディングはUTF-8なので、文字化けが解消されて閲覧できるようになる

日本語に限れば、ほかにも変換用のコマンドや変換目的にも利用できるページャなどがあるが、とりあえずiconvの使い方を覚えておけばよいだろう。iconvで指定できるエンコーディングはさまざまだ。-lオプションを指定すると、インストールされているiconvで利用できるエンコーディング名を次のように一覧表示させることができる。

# iconv -l
以下のリストには,全ての既知の文字集合が含まれています。これらの名前は
コマンドラインパラメータの FROM と TO の全ての組み合わせとして使用出来
るとは限りません。ある文字集合は複数の異なった名前 (別名,alias) で
リストされています。

 437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865,
  866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4,
  8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993, 10646-1:1993/UCS4,
  ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4, ANSI_X3.110-1983, ANSI_X3.110,
  ARABIC, ARABIC7, ARMSCII-8, ASCII, ASMO-708, ASMO_449, BALTIC, BIG-5,
...略...
  CSDECMCS, CSEBCDICATDE, CSEBCDICATDEA, CSEBCDICCAFR, CSEBCDICDKNO,
  CSEBCDICDKNOA, CSEBCDICES, CSEBCDICESA, CSEBCDICESS, CSEBCDICFISE,
  CSEBCDICFISEA, CSEBCDICFR, CSEBCDICIT, CSEBCDICPT, CSEBCDICUK, CSEBCDICUS,
  CSEUCKR, CSEUCPKDFMTJAPANESE, CSGB2312, CSHPROMAN8, CSIBM037, CSIBM038,
  CSIBM273, CSIBM274, CSIBM275, CSIBM277, CSIBM278, CSIBM280, CSIBM281,
...略...
  EBCDIC-AT-DE-A, EBCDIC-AT-DE, EBCDIC-BE, EBCDIC-BR, EBCDIC-CA-FR,
  EBCDIC-CP-AR1, EBCDIC-CP-AR2, EBCDIC-CP-BE, EBCDIC-CP-CA, EBCDIC-CP-CH,
  EBCDIC-CP-DK, EBCDIC-CP-ES, EBCDIC-CP-FI, EBCDIC-CP-FR, EBCDIC-CP-GB,
  EBCDIC-CP-GR, EBCDIC-CP-HE, EBCDIC-CP-IS, EBCDIC-CP-IT, EBCDIC-CP-NL,
  EBCDIC-CP-NO, EBCDIC-CP-ROECE, EBCDIC-CP-SE, EBCDIC-CP-TR, EBCDIC-CP-US,
...略...
  IBM-1122, IBM-1123, IBM-1124, IBM-1129, IBM-1130, IBM-1132, IBM-1133,
  IBM-1137, IBM-1140, IBM-1141, IBM-1142, IBM-1143, IBM-1144, IBM-1145,
  IBM-1146, IBM-1147, IBM-1148, IBM-1149, IBM-1153, IBM-1154, IBM-1155,
  IBM-1156, IBM-1157, IBM-1158, IBM-1160, IBM-1161, IBM-1162, IBM-1163,
  IBM-1164, IBM-1166, IBM-1167, IBM-1364, IBM-1371, IBM-1388, IBM-1390,
...略...
  ISO-IR-10, ISO-IR-11, ISO-IR-14, ISO-IR-15, ISO-IR-16, ISO-IR-17, ISO-IR-18,
  ISO-IR-19, ISO-IR-21, ISO-IR-25, ISO-IR-27, ISO-IR-37, ISO-IR-49, ISO-IR-50,
  ISO-IR-51, ISO-IR-54, ISO-IR-55, ISO-IR-57, ISO-IR-60, ISO-IR-61, ISO-IR-69,
  ISO-IR-84, ISO-IR-85, ISO-IR-86, ISO-IR-88, ISO-IR-89, ISO-IR-90, ISO-IR-92,
  ISO-IR-98, ISO-IR-99, ISO-IR-100, ISO-IR-101, ISO-IR-103, ISO-IR-109,
...略...
  JIS_C6229-1984-B, JIS_C62201969RO, JIS_C62291984B, JOHAB, JP-OCR-B, JP, JS,
  JUS_I.B1.002, KOI-7, KOI-8, KOI8-R, KOI8-RU, KOI8-T, KOI8-U, KOI8, KOI8R,
  KOI8U, KSC5636, L1, L2, L3, L4, L5, L6, L7, L8, L10, LATIN-9, LATIN-GREEK-1,
  LATIN-GREEK, LATIN1, LATIN2, LATIN3, LATIN4, LATIN5, LATIN6, LATIN7, LATIN8,
  LATIN9, LATIN10, LATINGREEK, LATINGREEK1, MAC-CENTRALEUROPE, MAC-CYRILLIC,
...略...
  OSF10020367, OSF10020370, OSF10020387, OSF10020388, OSF10020396, OSF10020402,
  OSF10020417, PT, PT2, PT154, R8, R9, RK1048, ROMAN8, ROMAN9, RUSCII, SE, SE2,
  SEN_850200_B, SEN_850200_C, SHIFT-JIS, SHIFT_JIS, SHIFT_JISX0213, SJIS-OPEN,
  SJIS-WIN, SJIS, SS636127, STRK1048-2002, ST_SEV_358-88, T.61-8BIT, T.61,
  T.618BIT, TCVN-5712, TCVN, TCVN5712-1, TCVN5712-1:1993, THAI8, TIS-620,
  TIS620-0, TIS620.2529-1, TIS620.2533-0, TIS620, TS-5881, TSCII, TURKISH8,
  UCS-2, UCS-2BE, UCS-2LE, UCS-4, UCS-4BE, UCS-4LE, UCS2, UCS4, UHC, UJIS, UK,
  UNICODE, UNICODEBIG, UNICODELITTLE, US-ASCII, US, UTF-7, UTF-8, UTF-16,
  UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, UTF7, UTF8, UTF16, UTF16BE,
  UTF16LE, UTF32, UTF32BE, UTF32LE, VISCII, WCHAR_T, WIN-SAMI-2, WINBALTRIM,
  WINDOWS-31J, WINDOWS-874, WINDOWS-936, WINDOWS-1250, WINDOWS-1251,
  WINDOWS-1252, WINDOWS-1253, WINDOWS-1254, WINDOWS-1255, WINDOWS-1256,
  WINDOWS-1257, WINDOWS-1258, WINSAMI2, WS2, YU

大丈夫、大丈夫だ! エンコーディング名を全て覚える必要はない。細かい説明は省くが、大体次の5種類あたりについて知っておけば十分だ。

エンコーディング 説明
UTF-8、UTF8 Unicodeのエンコーディング方式の1つ
CP932、MS932 SHIFT_JISを拡張したもの。Windowsで使われる
SHIFT_JIS、SHIFT-JIS、SJIS シフトJIS
EUC-JP、EUCJP 日本語拡張UNIXコード。UNIX系OSで使われていた
ISO-2022-JP、ISO2022JP 通信で使われることがある

最低限のエンコーディングとして「WindowsはCP932」「macOSとLinuxはUTF-8」、こう覚えておけばよいだろう。補足すると、SHIFT_JISはCP932のようなもの(CP932がSHIFT_JISを拡張している)で、EUC-JPはUTF-8が普及する前にUNIX系OSで使われていたものだ。

EUC-JPについて知っておく必要があるのは、古いコマンドがそのまま使われているようなUNIX系OSだと、UTF-8は利用できず、EUC-JPでないと動かないケースがあることだ。そういったシステムを使う場合にはEUC-JPに合わせる必要があるし、テキストデータもEUC-JPに変換する必要がある。

現在ではUTF-8が広く利用できるため、いったんUTF-8に変換してしまえばいろいろ使えるだろう。文字化けして困るようなことは最近減ったので、iconvコマンドを実行する機会はそれほどないとは思う。しかし、万一の際にiconvコマンドの使い方を知っているのと知らないのとでは雲泥の差だ。エンコーディングを変換するコマンドとしてiconvの存在は覚えておいていただきたい。