今回の記事では、テキストファイルのエンコーディングを、シフト JIS から BOM あり/なしの UTF-8 に変換するバッチプログラムを紹介します。
内容が Excel から少し離れますが、次の記事で CSV ファイルの文字化け問題を取り上げる予定で、それに関連して Windows でのテキストエンコーディングの話題を本記事として切り離し、先行公開するものです。
【本記事のバッチは非推奨です】
改善された最新版の UTF-8 変換バッチを公開しました。
本記事のバッチは非推奨とさせていただきます。
本記事の一部バッチにあった不具合を解消したうえ、信頼性、使い勝手もよくなっていますので、今後はこちらのご利用をよろしくお願いいたします。 www.shegolab.jp【更新 2018/05/12】 バッチプログラムを一部修正しました。Windows 10 の UTF-8 サポートへの対応です。(追記参照)
Windows のテキストエンコーディング事情
そもそもなぜ Windows でよく文字化けするのでしょうか。
ちゃんと説明すると長くなるのですが、一言でいえばそれは Windows が、ヘンクツだからです。
もう少し詳しく説明すると Windows を作った世界的企業である某社の中の人たちが、ヘンクツだからです。
現在、インターネットやコンピュータで主流となっているテキストファイルのエンコーディング方式は、国際標準規格の「UTF-8」と呼ばれているものです。
これにより、テキストファイルは国や言語、システムの種類によらずに交換できるようになっています。
しかしヘンクツな Windows 環境では、旧来の「シフトJIS(Shift_JIS)」という日本語専用の方式をかたくなに使い続けており、世界標準の UTF-8 のファイルを開いても文字化けして読めないのです。
もちろん、国際的 OS である Windows さんのほうでもだいぶ前から UTF-8 に対応してはいるのですが、これまたヘンクツなことに、それは「BOM 付き UTF-8」という、非常に不可解な方式で、言わば「オレオレ UTF-8 」とでも呼べるものなのです。
このオレオレ UTF-8 のファイルは、他システムとのやり取りするとなると、かえって不具合を起こす原因となるという困りものです。
それを変換できるテキストエディタや専用ツールは探せばあります。文字化けしても、ツールなどで黙々と変換していけば何とかなるのですが、冷静に考えるとそれは「余計な仕事」です。
まして自分の顧客やユーザにまで「テキストエディタで保存しなおしてください」とか、「このフリーソフトをダウンロードしてインストールしてください」とはお願いできるものでもありません。
Windows さんの都合でみんなが困っているのだから、本来は Windows さんの方で、この問題を解消するための機能か設定あるいはツールなりを用意してしかるべきなのですが、それさえしないのは、そう、ヘンクツだからです。
ヘンクツのイヤがらせにかかずらっているヒマはありません。
バッチでも使ってさっさと片付けてしまいましょう。
UTF-8 変換バッチ取り揃え
【本記事のバッチは非推奨です】
改善された最新版の UTF-8 変換バッチを公開しました。
本記事のバッチは非推奨とさせていただきます。
本記事の一部バッチにあった不具合を解消したうえ、信頼性、使い勝手もよくなっていますので、今後はこちらのご利用をよろしくお願いいたします。 www.shegolab.jp
テキストファイル を 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\" ) )
【使い方】
- 上記バッチスクリプトのうち使いたいものをテキストエディタにコピー&ペーストして、そのままバッチファイルとしてデスクトップなどに保存します
- バッチファイルにするため、ファイル名の拡張子を「.bat」にしてください
- 作成したバッチファイルのアイコンに、変換元(シフトJISなど)のテキストファイルをドラッグ&ドロップします。
- 対応するテキストファイルは、拡張子が「.txt」か「.csv」となっているもののみです
- 複数のテキストファイルをまとめてドラッグ&ドロップできます
- UTF-8 に変換されたテキストファイルが変換元ファイルと同じ場所に作成されます
- 変換元ファイルは上書き・変更されません
- 書き込み不可な場所では変換ファイル作成に失敗します。
本バッチを頻繁に使いそうな見込みがあるなら、コンテキストメニューの「送る」メニューへ登録しておくと便利です。
そうするとどこでも、変換したいテキストファイルを右クリックして「送る」メニューからこのバッチを実行することができます。
バッチを「送る」に追加するには、エクスプローラのアドレスバーに「shelll:sendto」と入力して開かれるフォルダに、そのバッチファイルを移動します。
【制限事項】 ファイル名に特定の記号文字があると変換処理されないことが分かりました。(ご指摘ありがとうございます)
ファイル名に以下の文字が含まれると、エラーになる可能性があります。
* 半角スペース() (複数半角スペースが連続した場合)
* 全角スペース()
* カンマ(,
)
* セミコロン(;
)
* 等号(=
)
* キャレット(^
)
* 半角かっこ((
)
)
* パーセント(%
)
* エクスクラメーション(!
)
* アンパサンド(&
)
これらの文字があると正常に動作しない可能性があるので、本バッチご使用にあたっての制限事項とさせていただきます。
また、この問題に対処した改良版を公開しましたので、大量ファイルを変換したいなどお困りの方は以下の記事のバッチをお試しください。 www.shegolab.jp
【注意】 本記事のバッチに限らず、BAT ファイルはメールやチャットに添付したり、Webや共有フォルダで公開される状態に置かないでください。
内容を確認せずに BAT ファイルを実行するのは非常に危険です。信頼できないバッチやスクリプトはうかつに実行しないように注意してください。
【注意】 巨大なファイルを変換しないでください。メモリが足りないというエラーになる可能性があります。
まとめ
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 では違うかもしれません。読者の方に人柱様はいらっしゃいませんか)
関連記事
編集履歴
- [2017/12/30] 公開
- [2023/04/24] 最新版への案内を追加