2016-04-28

備忘録 - Windows用の文字コード変換は安直にSJISではなくてCP932を指定

Wikipediaより
結論:
iconvコマンドでSJIS変換する場合はCP932を指定しましょう。
% iconv -t CP932 linux-file-in > windows-file-out
% iconv -f CP932 windows-file-in > linux-file-out

解説:
Linuxの日本語の文字コードはUTF-8が標準設定されていることが多くなりました。
一方のWindowsではUTF-8のファイルは扱えますが、まだまだShift JISのファイルの方が相性が良いようです。
たとえば、UTF-8のCSVファイルをダブルクリックしたら文字化けすることが多いですし、メモ帳のデフォルト文字コードもSJIS (ANSI)です。

そこで文字コードの変換が必要になります。
テキストファイルの文字コード変換を行うLinux上の業界標準のコマンドがiconvです。
iconvコマンドは、オプション -f と -t で、変換元と変換先の文字コードを指定します。
デフォルトの文字コードはUTF-8です。

ここでは陥りやすいのが、Windows用にShift JISに変換する場合、Shift JISだからといって安直に、SJIS を指定することです。
これ絶対ダメです。

少しテストしただけでは気付かないのですが、いわゆる外字(①など)が、標準規格のSJISでは定義されていないので、簡単にエラーになってiconvが途中終了してしまいます(これはこれで外字の存在確認に使えるのですが)。

ではShift JIS用に何を指定するかといえば、CP932を使います。

①などの外字の文字コードは、むかしむかし、Microsoftが日本語Windows用に、JIS規格のShift JISを拡張して割り当てました。
この拡張Shift JISの名前がCode Page 932 (CP932) です。
(ここの説明は感覚的で専門家が見たら正確ではないかもしれません。)(なお、iconvでの指定はCP932ですが、JavaではMS932、WebではWindows-31Jを指定します。)
(Emojiではどうなるのかは、今度調べたいと思います。)

CP932という、なんとも覚えにくい文字コードの名前です。
Shift JISの文字コード変換はSJISではない」ということだけ、最低でもいつも思い出すようにしましょう。
(わたしは実際、今日これで失敗してしまいました。)

[2020-11-13] UTF-8からSJISに変換する際に、絵文字などが含まれている場合は、また途中でエラーになって落ちてしまいます。
なので今後は、

% iconv -t CP932//TRANSLIT linux-file-in > windows-fie-out

の指定を心掛けるのがより良いと思います。

No comments:

Post a Comment