今日を乗り切るExcel研究所

Excel に働かされていませんか

シフトJISのテキストファイルをUTF-8に変換するバッチ

今回の記事では、テキストファイルのエンコーディングを、シフト JIS から BOM あり/なしの UTF-8 に変換するバッチプログラムを紹介します。

内容が Excel から少し離れますが、次の記事で CSV ファイルの文字化け問題を取り上げる予定で、それに関連して Windows でのテキストエンコーディングの話題を本記事として切り離し、先行公開するものです。

【更新 2018/05/12】 バッチプログラムを一部修正しました。Windows 10 の UTF-8 サポートへの対応です。(追記参照)

Windows のテキストエンコーディング事情

そもそもなぜ Windows でよく文字化けするのでしょうか。

ちゃんと説明すると長くなるのですが、一言でいえばそれは Windows が、ヘンクツだからです。
もう少し詳しく説明すると Windows を作った世界的企業である某社の中の人たちが、ヘンクツだからです。

現在、インターネットやコンピュータで主流となっているテキストファイルのエンコーディング方式は、国際標準規格の「UTF-8」と呼ばれているものです。
これにより、テキストファイルは国や言語、システムの種類によらずに交換できるようになっています。

しかしヘンクツな Windows 環境では旧来の「シフトJIS(Shift_JIS)」という日本語専用の方式をかたくなに使い続けており、世界標準の UTF-8 のファイルを開くと文字化けになります。

もちろん、Windows でもだいぶ前から UTF-8 に対応してはいるのですが、これまたヘンクツなことに、それは「BOM 付き UTF-8」という、非常に不可解な方式で、言わば「オレオレ UTF-8 」とでも呼べるものです。
このオレオレ UTF-8 のファイルは、他システムとのやり取りするとなると、かえって不具合を起こす原因となっています。

それを変換できるテキストエディタや専用ツールは探せばあります。文字化けしても、ツールなどでチマチマと変換していけば何とかなるのですが、冷静に考えるとそれは「余計な仕事」です。

まして自分の顧客やユーザにまで「テキストエディタで保存しなおしてください」とか、「このフリーソフトをダウンロードしてインストールしてください」とはお願いできるものでもありません。

Windows さんの都合でみんなが困っているのだから、本来は Windows さんの方で、この問題を解消するための機能か設定あるいはツールなりを用意してしかるべきなのですが、それさえしないのは、そう、ヘンクツだからです。

ヘンクツのイヤがらせにかかずらっているヒマはありません。
バッチでも使ってさっさと片付けてしまいましょう。

 



UTF-8 変換バッチ取り揃え

テキストファイル を UTF-8 に変換するバッチスクリプトを作成しました。
コピペでいつでも用意できて、使い方もテキストファイルをドラッグ&ドロップするだけです。
状況に応じて4つのパターンを用意しましたので、適宜必要なものをコピペして使ってください。
ファイルの拡張子が「.txt」と「.csv」の場合のみ変換対象としています。

「シフト JIS」 → 「標準 UTF-8」 変換

シフトJIS(Shift_JIS)のテキストファイルを「BOMなし」の UTF-8 に変換します。
これが標準です。
Excel で保存した CSV ファイルを他所に送るときなどに使ってください。

@echo off
:Shift_JIS -> UTF-8
setlocal enabledelayedexpansion
for %%f in (%*) do (
  echo %%~ff| findstr /l /e /i ".txt .csv"
  if !ERRORLEVEL! equ 0 (
    powershell -nop -c "&{[IO.File]::WriteAllText($args[1], [IO.File]::ReadAllText($args[0], [Text.Encoding]::GetEncoding(932)))}" \"%%~ff\" \"%%~ff.utf8%%~xf\"
  )
)

「シフト JIS」 → 「BOM 付き UTF-8」 変換

シフトJIS(Shift_JIS)のテキストファイルを「BOM付き」の UTF-8 に変換します。
これは Windows 環境専用です。
Excel で開くつもりの CSV ファイルならこちらを使います。

@echo off
:Shift_JIS -> BOM UTF-8
setlocal enabledelayedexpansion
for %%f in (%*) do (
  echo %%~ff| findstr /l /e /i ".txt .csv"
  if !ERRORLEVEL! equ 0 (
    powershell -nop -c "&{[IO.File]::WriteAllText($args[1], [IO.File]::ReadAllText($args[0], [Text.Encoding]::GetEncoding(932)), [TEXT.Encoding]::UTF8)}" \"%%~ff\" \"%%~ff.bom+utf8%%~xf\"
  )
)

「標準 UTF-8」 → 「BOM 付き UTF-8」 変換

「BOM なし」の UTF-8 のテキストファイルに BOM を追加して「BOM 付き」UTF-8 に変換します。
Windows 環境以外で作成された UTF-8 ファイルが Microsoft 社製のアプリケーションで開けるようになります。
たとえば、貰った CSV ファイルが Excel で文字化けしたらこのバッチを使ってみてください。

@echo off
:UTF-8 -> BOM UTF-8
setlocal enabledelayedexpansion
if not exist "%TMP%\bom.utf8" powershell -nop -c "&{[IO.File]::WriteAllText('%TMP%\bom.utf8', '', [TEXT.Encoding]::UTF8)}"
for %%f in (%*) do (
  echo %%~ff| findstr /l /e /i ".txt .csv"
  if !ERRORLEVEL! equ 0 (
    copy /b "%TMP%\bom.utf8" + "%%~ff"  "%%~ff.bom%%~xf" > nul
  )
)

「BOM 付き UTF-8」 → 「標準 UTF-8」 変換

BOM 付き UTF-8 の BOM を削除し、標準UTF-8に戻します。
Windows 環境で作成した BOM 付き UTF-8 のテキストファイルを、オープンなインターネットやデータベースなど他のシステムに送りたいときにこちらを使います。

@echo off
:BOM UTF-8 -> UTF-8
setlocal enabledelayedexpansion
for %%f in (%*) do (
  echo %%~ff| findstr /l /e /i ".txt .csv"
  if !ERRORLEVEL! equ 0 (
    powershell -nop -c "&{[IO.File]::WriteAllText($args[1], [IO.File]::ReadAllText($args[0]))}" \"%%~ff\" \"%%~ff.bom-free%%~xf\"
  )
)

使い方

  1. 上記バッチスクリプトのうち使いたいものをテキストエディタにコピー&ペーストして、そのままバッチファイルとしてデスクトップなどに保存します
    • バッチファイルにするため、ファイル名の拡張子を「.bat」にしてください
  2. 作成したバッチファイルのアイコンに、変換元(シフトJISなど)のテキストファイルをドラッグ&ドロップします。
    • 対応するテキストファイルは、拡張子が「.txt」か「.csv」となっているもののみです
    • 複数のテキストファイルをまとめてドラッグ&ドロップできます
  3. UTF-8 に変換されたテキストファイルが変換元ファイルと同じ場所に作成されます
    • 変換元ファイルは上書き・変更されません
    • 書き込み不可な場所では変換ファイル作成に失敗します。

本バッチを頻繁に使いそうな見込みがあるなら、コンテキストメニューの「送る」メニューへ登録しておくと便利です。
そうするとどこでも、変換したいテキストファイルを右クリックして「送る」メニューからこのバッチを実行することができます。

f:id:shego:20171229220226p:plain

バッチを「送る」に追加するには、エクスプローラのアドレスバーに「shelll:sendto」と入力して開かれるフォルダに、そのバッチファイルを移動します。

【注意】 巨大なファイルを変換しないでください。メモリが足りないというエラーになる可能性があります。

まとめ

Winodws はヘンクツ。

本バッチスクリプトは Windows 7 と 10 で動作確認しました。

追記

【追記その1】Office 365 では CSV を UTF-8 で保存できます

Office 365 版の Excel 2016 では、CSV を UTF-8 で保存できるようになっていました。「ファイル」⇒「名前を付けて保存」でファイルの種類を選択するプルダウンに「CSV UTF-8(カンマ区切り)(*.csv)」という項目が、新規追加されています。前からあった CSV 保存とは別です。

保存した CSV ファイルをダブルクリックして、文字化けなしでExcel で開けます。 Office 365 をご使用のかたはお試しください。

ただし、この CSV は「BOM 付き UTF-8」です。

【追記その2】Windows 10 で UTF-8 が使用可能になります

Windows 10 では、2018 年の4月末にリリースされたアップデートから、UTF-8 をシステム標準で使える設定が追加されました。

しかも BOM なし!

ただし、まだベータ版(お試し版)扱いなので、無用なトラブルを避けるため一般のユーザさんは正式になるまで待った方がいいでしょう。(設定方法の説明は控えます)

試しに、システムロケール設定を UTF-8 に変更して、Excel で CSV 保存してみたところ、UTF-8 になっていました! BOM なしの!!

Windows さん、ヘンクツとかいってごめんなさい。

その BOM なし CSV ファイルを今度はダブルクリックして Excel で開くと・・・あー、文字化けしてます。 前言撤回。※

(※ Windows 10 (1803) / Excel 2013で確認しました。Office 365 では違うかもしれません。読者の方に人柱様はいらっしゃいませんか)

関連記事

www.shegolab.jp