SJISからUTF-8へ変換するバッチファイルを作ってみる

はじめに

今回は、nkfを使用して、指定したフォルダ配下の指定拡張子ファイルを再帰的にSJISからUTF-8へ変換するバッチファイルを作ってみる。

環境

Windows 11 Pro
コマンドプロンプト
nkf 2.1.5

前提条件

nkfのダウンロードとインストール

nkfはWindowsでも利用可能な文字コード変換ツール。以下からダウンロードして使用する。

※バッチファイルと同じフォルダにnkf.exeを配置
※または環境変数PATHに追加

nkfの動作確認

# nkfのバージョン確認
nkf --version

# ヘルプ表示
nkf --help

バッチファイルの作成

基本版の作成

まず、基本的なSJISからUTF-8変換バッチファイル sjis2utf8.bat を作成する。

sjif2utf8.bat
@echo off
setlocal enabledelayedexpansion

rem 引数チェック
if "%~1"=="" (
    echo 使用方法: %~nx0 ^<対象フォルダ^> ^<拡張子^>
    echo 例: %~nx0 C:\myproject txt
    echo 例: %~nx0 "C:\my folder" csv
    exit /b 1
)

if "%~2"=="" (
    echo 使用方法: %~nx0 ^<対象フォルダ^> ^<拡張子^>
    echo 例: %~nx0 C:\myproject txt
    echo 例: %~nx0 "C:\my folder" csv
    exit /b 1
)

set "TARGET_DIR=%~1"
set "FILE_EXT=%~2"

rem 対象フォルダの存在確認
if not exist "%TARGET_DIR%" (
    echo エラー: 対象フォルダが見つかりません: %TARGET_DIR%
    exit /b 1
)

rem nkfの存在確認
nkf --version >nul 2>&1
if errorlevel 1 (
    echo エラー: nkfが見つかりません。nkf.exeをPATHに追加するか、同じフォルダに配置してください
    exit /b 1
)

echo SJISからUTF-8への変換を開始...
echo 対象フォルダ: %TARGET_DIR%
echo 対象拡張子: %FILE_EXT%
echo.

set "CONVERTED_COUNT=0"
set "ERROR_COUNT=0"

rem 拡張子にワイルドカードが含まれていない場合は追加
set "SEARCH_EXT=%FILE_EXT%"
echo %SEARCH_EXT% | findstr /r "\*" >nul
if errorlevel 1 (
    set "SEARCH_EXT=*.%FILE_EXT%"
)

rem ファイルを再帰的に検索して変換
for /r "%TARGET_DIR%" %%f in (%SEARCH_EXT%) do (
    if exist "%%f" (
        echo 処理中: %%f
        
        rem 一時ファイルを作成
        set "TEMP_FILE=%%f.tmp"
        
        rem nkfでSJISからUTF-8へ変換
        nkf -w "%%f" > "!TEMP_FILE!" 2>nul
        
        if !errorlevel! equ 0 (
            rem 変換成功時、元ファイルを置き換え
            move "!TEMP_FILE!" "%%f" >nul 2>&1
            if !errorlevel! equ 0 (
                echo   成功: %%f
                set /a CONVERTED_COUNT+=1
            ) else (
                echo   エラー: ファイル置き換えに失敗 %%f
                del "!TEMP_FILE!" >nul 2>&1
                set /a ERROR_COUNT+=1
            )
        ) else (
            echo   エラー: 文字コード変換に失敗 %%f
            del "!TEMP_FILE!" >nul 2>&1
            set /a ERROR_COUNT+=1
        )
    )
)

echo.
echo 変換結果:
echo   成功: %CONVERTED_COUNT% ファイル
echo   エラー: %ERROR_COUNT% ファイル
echo.
echo 変換処理が完了しました
pause

使用方法

# テキストファイルを変換
sjis2utf8.bat "C:\myproject" txt

# CSVファイルを変換
sjis2utf8.bat "C:\data" csv

# スペースを含むパスの場合
sjis2utf8.bat "C:\My Documents\project" txt

トラブルシューティング

nkfが見つからない場合

nkfコマンドが見つからないエラーが発生した場合

nkfのダウンロードとインストール

  1. https://www.vector.co.jp/soft/win95/util/se295331.html からダウンロード
  2. nkf.exeをバッチファイルと同じフォルダに配置
  3. または環境変数PATHにnkf.exeのフォルダを追加
  4. PATHの確認 echo %PATH%
  5. nkfの動作確認
nkf --version

文字化けが発生する場合

  • ファイルが既にUTF-8の場合は変換不要
  • BOMの有無を確認する
  • エンコーディングがSJIS以外の可能性がある

アクセス権限エラー

  • 管理者権限でコマンドプロンプトを実行
  • ファイルが他のプログラムで開かれていないかを確認
  • 読み取り専用属性が設定されていないかを確認

ファイルが処理されない場合

  • 拡張子の指定が正しいかを確認
  • ファイルパスにスペースが含まれる場合はダブルクォートで囲む
  • 対象フォルダに該当ファイルが存在するかを確認

注意事項

nkfについて

nkfは日本で開発された文字コード変換ツール。
Windowsでも利用可能で、SJISEUC-JPUTF-8JISなどの相互変換が可能。

バックアップの重要性

元ファイルを上書きするため、重要なファイルは事前にバックアップを取ること。

nkfのオプション

使用しているnkfのオプション

  • -w: UTF-8で出力

※ コマンドを変えることで改行コードをCRLFLFにすることも可能

参考

おわりに

nkfを使って文字コードを一括で変換するバッチを作成した。
nkfに依存する形となるが、bat自体は簡素になるのでこの方法が良いと考えた。
batについては生成AIにつくってもらっている。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。