今日を乗り切るExcel研究所

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

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

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

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

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

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

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

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

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

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

まあ、Windows で文字化けしても、テキストエディタやツールなど使って適切なエンコーディングにチマチマと変換していけば何とかなるのですが、それは冷静に考えると完全に「余計な仕事」です。

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

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

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

 



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

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

「シフト 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]::Default))}" \"%%~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]::Default), [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 で動作確認しました。