エンコード確認ツールを作ってみた！



## 前提条件・背景
SQLplusから日本語を含む、SQLファイルを実行する時に、ファイルのエンコーディングがSJISじゃないと文字化けを起こす事象があったため、エンコーディングを判定するツールを作成してみた

## 思考指針
この記事では、このエンコーディング判定ツールのコードを初心者向けにわかりやすく解説していきます。また、バッチファイルを使ってPowerShellスクリプトに変数を渡す方法についても紹介します。

## エンコード判定ツールのコード

こちらが、PowerShellで作成したエンコード判定ツールのコードです。このスクリプトは、指定したフォルダ内のファイルがUTF-8またはShift-JISかをチェックしてくれます。


### Get-FileEncoding.ps1

```powershell
# フォルダパスを引数として受け取る
param (
    [string]$folderPath
)

# 出力エンコーディングをUTF-8に設定
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 指定されたフォルダが存在するかを確認
if (-Not (Test-Path -Path $folderPath -PathType Container)) {
    Write-Host "指定したフォルダは存在しません。"
    exit
}

# ファイルのエンコードを判定する関数
function Get-FileEncoding {
    param (
        [string]$filePath
    )

    # ファイルのバイトデータを読み込む
    $byte = [System.IO.File]::ReadAllBytes($filePath)

    # UTF-8判定
    try {
        $utf8Content = [System.Text.Encoding]::UTF8.GetString($byte)
        $decodedUtf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($utf8Content)

        if ($byte.Length -eq $decodedUtf8Bytes.Length -and -not ($byte -xor $decodedUtf8Bytes)) {
            return "UTF-8"
        }
    } catch {}

    # Shift-JIS判定
    try {
        $sjisContent = [System.Text.Encoding]::GetEncoding("shift_jis").GetString($byte)
        $decodedSjisBytes = [System.Text.Encoding]::GetEncoding("shift_jis").GetBytes($sjisContent)

        if ($byte.Length -eq $decodedSjisBytes.Length -and -not ($byte -xor $decodedSjisBytes)) {
            return "Shift-JIS"
        }
    } catch {}

    return "Unknown encoding"
}

# フォルダ内のすべてのファイルを取得
$files = Get-ChildItem -Path $folderPath -File

# 各ファイルのエンコードを判定
foreach ($file in $files) {
    $encoding = Get-FileEncoding -filePath $file.FullName
    Write-Host ("{0} のエンコード: {1}" -f $file.Name, $encoding)
}
```

## バッチファイルでの変数渡し

ここからは、バッチファイルを使ってPowerShellスクリプトにフォルダパスを渡す方法を紹介します。以下はその例です。

### run_encoding.bat

```bat
@echo off
:: コードページをUTF-8に設定
chcp 65001 >nul

:: フォルダパスの入力を促す
set /p folderPath=フォルダパスを入力してください（日本語も使用可）: 

:: フォルダパスが存在するかを確認
if not exist "%folderPath%" (
    echo フォルダパスが存在しません。パスを確認してください。
    exit /b 1
)

:: PowerShellスクリプトを呼び出す（UTF-8対応）
powershell -NoProfile -ExecutionPolicy Bypass -Command "& {param([string]$folderPath) .\Get-FileEncoding.ps1 -folderPath $folderPath}" -folderPath "%folderPath%"

pause
```

### どう動くの？
1. `run_encoding.bat`を実行すると、まず指定したフォルダパスが変数`folderPath`に設定されます。
2. 次に、PowerShellコマンドが呼び出され、`Get-FileEncoding.ps1`が実行されます。ここで`-folderPath`オプションを使って、先ほどの変数を渡します。

これで、バッチファイルからフォルダパスを簡単に指定できるようになります。

## コードの解説

### 1. フォルダパスの引数を受け取る
スクリプトは実行時に指定されたフォルダパスを受け取ります。これがないと何も始まりません！

### 2. 出力エンコーディングの設定
コンソールの出力エンコーディングをUTF-8に設定し、日本語がちゃんと表示されるようにします。

### 3. フォルダの存在確認
指定されたフォルダがなかったら、メッセージを表示してスクリプトを終了します。これで無駄なエラーを防げますね。

### 4. ファイルのエンコーディング判定
`Get-FileEncoding`関数を使ってファイルを読み込み、そのエンコーディングを判定します。

- **UTF-8 の判定**: ファイルをUTF-8としてデコードし、元のバイト列と一致するかを確認します。バッチリなら「UTF-8」と返します。
- **Shift-JIS の判定**: 同じ要領で、Shift-JISでも判定します。一致すれば「Shift-JIS」と返します。

### 5. フォルダ内のファイルを取得しエンコーディングを判定
指定したフォルダ内のファイルを全部取得して、各ファイルのエンコーディングを判定して表示します。

## まとめ
このツールを使えば、SQLplusでSQLファイルを実行する前にエンコーディングの問題をサクッと解決できます。バッチファイルを使ってPowerShellスクリプトに変数を渡す方法も紹介したので、より便利に使えると思います。ぜひ試してみてくださいね！
## 採用拡大中！
アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニア仲間を大募集しています！
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう！
お問い合わせはこちらから↓
https://official.assisteng.co.jp/contact/