UTFとか文字コードの話とExcelやpowershellなどのアプリケーション対応を調べた

迂闊ながら職場で"SJISでデータ下さい"って言ったらゴミを見るような目で見られたので調べます(メールでデータ送るから、って言われたから流れでSJISって言っちゃったねん

登場人物(文字コード編)

UTF-8

UTF-8と言っても2つあり、BOMありとBOMなし。BOMというのはバイトオーダーマークで、これがあればプログラムがファイルを読み込むときに確実にUTF-8と分かるが、BOM付ファイルを1バイト目から実データ部分と扱って処理しようとすると死亡する。なおExcelUTF-8(BOM付)なら文字化けせず開けるらしい

UTF-16

wikipediaさんによると、UTF-16は5種類あるらしい。

BEとLEというのはビッグエンディアンとリトルエンディアンというもので、実装方法(?)によって差があるあるらしいが、ファイルが読み込めるか否かはBEやLEに関係なく、BOMが目印になるか、そもそもUTF-16に対応したファイルかによる様子。

どうもWindowsの世界ではUnicode = UTF-16 LEになる様子。UTF-16はBOMなしだとBEと判定されるらしい。となると、UTF-16 BE,UTF-16 BOMなし(BE)の違いが分からなかったので、UTF-16 BOMなし(BE)は除外して調べる。

登場人物(プログラム編)

  • Excel 2016:時に方眼紙、時にユーザー一覧出力先とITの世界で大活躍する一線級ソフトウェア
  • サクラエディタ:私の愛する最強エディタ。インストール不要で客先にも持ち込みやすい
  • メモ帳:ゴミだがサーバーにはこれしかない事多し。
  • powershell ISEのエディタ部分:実はサーバー上でメモ帳以上に使えるもう1つのエディタ。正規表現も使えるよ
  • VisualStudioCode:powershell ISE以上のエディタ。1度慣れるとISEには戻れないしサクラエディタの地位も怪しい。起動に1秒くらいかかるのが欠点。
  • powershell v5:cmd.exeを過去のものにしたWindows標準のコマンドラインツール。サーバーへのリモートアクセスからWebスクレイピングもがんばりゃ出来る優れもの。

チェック結果

読み込み

- Excel 2016 サクラエディタ メモ帳 ISEエディタ部分 vscode ps v5
UTF-8 × × △ ※1 △ ※2
UTF-8(BOM付)
UTF-16 BE × × × × ×
UTF-16 LE × × × × ×
UTF-16 BOM BE ×
UTF-16 BOM LE
  • ※1 自動判別できない。読み込んだ後、手動で文字コードを指定すれば読み込み可能
  • ※2 -Encording オプションを明示的に指定する事で読み込み可能

書き出し

- Excel 2016 サクラエディタ メモ帳 ISEエディタ部分 vscode ps v5
UTF-8 × × × △ ※5
UTF-8(BOM付) △ ※3 ○ ※4
UTF-16 BE × × × × ×
UTF-16 LE × × × × ×
UTF-16 BOM BE × ○ ※4
UTF-16 BOM LE ○ ※4 ○ ※4
  • ※3 2016年10月の最新版Excelcsv形式のみエクスポート可能
  • ※4 タブ区切り形式のみエクスポート可能
  • ※5 開いた文字コードと同じ形式でしか保存できない
  • ※6 -Encording オプションを明示的に指定する事で読み込み可能

結論と注意点

  • WindowsではUTF-8(BOM付)か、UTF-16 BOM付 LEを使えば、基本的に読めない事はない
  • サクラエディタUTF-8で保存する際、デフォルトではBOMにチェックが入っておらずBOMなしで保存されてしまうので注意
  • Excelで作成したデータをUTF-8(BOM付)、UTF-16 BOM付 LEに保存する際は、一度SJISなどで保存してからメモ帳で変換するのがよい(MS公式もアナウンスしている)
  • powershellで-encordingに何も指定しないと、unicode(UTF-16 BOM付 LE)で保存される
  • となると全てのファイルをunicode(UTF-16 BOM付 LE)で保存すればいいじゃんと思ったりしてしまうが、UTF-8に比べてファイルサイズが1.5倍くらいになってしまうので悩ましい
  • よって場面によっては多少面倒だが、UTF-8(BOM付)で保存するのがよい

参考

Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)