nkf や PowerShell で文字コード変換

shift-jis と utf-8 の混在問題に関する記事(リンクリスト)に戻る

Windows10 用の文字コード変換

業務用テキストファイルの文字コードに utf-8 と shift-jis の両方の文字コードを用途に応じて両方使用している場合、どうしても utf-8 と shift-jis を相互に変換しなければならない事がある。

utf-8 から shift-jis への変換は以前の記事で書いたように、一部の文字が shift-jis で表せない為、その文字だけ文字化けする。

この問題へは各社で独自にルールを決めて対処する必要がある。

ただ、日本語で常用漢字だけしか使っていなければ、単純にコマンドやツールなどで、文字コードを変換できる。

今回は、業務ユーザーが自分で手元のPCで手軽に文字コードを変換する方法を説明する。

 

cmd (コマンドプロンプト) を使用している場合

業務ユーザーが普段からcmd(コマンドプロンプト)を使用している場合は、cmd用のコマンドで文字コード変換した方が良い。

以下のサイトから、nkfwin.zip をダウンロードして適当なフォルダーに配置する。

nkf.exe nkf32.dll Windows用の詳細情報 : Vector ソフトを探す!
ネットワーク用漢字コード変換フィルタ シフトJIS,EUC-JP,ISO-2022-JP,UTF-8,UTF-16

インストールは特に必要無い。

環境変数のPATHにそのフルパスを追加する。

既にPATHに追加されているパスに nkf.exe と nkfwin.exe を配置すると手っ取り早い。

cmdを開き直し、nkf –version とコマンドラインに入力して以下の値が出れば使用できる。

Network Kanji Filter Version 2.1.1 (2010-08-08) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2010, The nkf Project.

使用方法、

nkf はテキストファイルを読み込み標準出力へ出力する。

この時、コマンドオプションで入力エンコーディングと、出力エンコーディングを自由に指定できる。

エンコーディング関連コマンドオプションは、入力と出力でアルファベットが同じになっており、大文字が入力、小文字が出力を意味する。

エンコーディング関連コマンドオプションは以下のようになる。

x
入力エンコーディングの指定(BOMは関係ない)
-J  JISコード
-E  EUCコード
-S  シフトJISコード
-W  UTF-8コード
-W8 UTF-8コード
-W16    UTF-16コード(LE)
-W16B   UTF-16コード(BE)
xxxxxxxxxx
出力エンコーディングの指定
-j  JISコード
-e  EUCコード
-s  シフトJISコード
-w  UTF-8コード(BOMなし)
-w8 UTF-8コード(BOM有り)
-w16    UTF-16コード(BE:BOMなし)
-w16B   UTF-16コード(BE:BOM有り)
-w16L   UTF-16コード(LE:BOMなし)
-w16L0  UTF-16コード(LE:BOM有り)

utf-16コードだけ入力と出力でやや異なるが他はほぼ同じだ。

cmd 上で、text8.txt という utf-8 のテキストファイルを、shift-jis で標準出力する場合は以下のようにコマンドラインに入力する。

utf-8 から、shift-jis へ変換

xxxxxxxxxx
nkf -W -s text8.txt

コマンドプロンプトに text8.txt の内容が表示される。

コマンドプロンプトは shift-jis しか表示できないので、-s で shift-jis に変換している。

これをファイルに保存するときは以下のようにパイプでリダイレクトする。

xxxxxxxxxx
nkf -W -s text8.txt > after8.txt

after8.txt に、text8.txt の内容が shift-jis に変換されて書き込まれる。

text8.txt 自体を変換する場合は、–overwrite オプションを使用する。

(ハイフンが二つなので注意)

xxxxxxxxxx
nkf -W -s --overwrite text8.txt

逆に shift-jis から、utf-8 へ変換する場合は、以下のようになる。

BOMなし

xxxxxxxxxx
nkf -S -w --overwrite text8.txt

BOM有り

xxxxxxxxxx
nkf -S -w8 --overwrite text8.txt

詳細な解説は、以下のサイトが詳しいので、見て欲しい。

【 nkf 】コマンド――文字コードと改行コードを変換する

【 nkf 】コマンド――文字コードと改行コードを変換する
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「nkf」コマンドです。

 

cmd を使用しない場合は PowerShell を使用する

現場のユーザーがcmd(コマンドプロンプト)を使用していない場合は、 PowerShell の標準機能を使用して文字コードを変換する事ができる。

ここでは PowerShell v7.0 を使用する。

 

nkf は PowerShell で起動はするが、正しく動作しない。

パイプの仕様が違うためか、エンコーディングの変換ができない。

よって cmd を使用できないのなら、nkf も使用できない。

 

コマンドレットの Get-Content と Out-File をパイプで繋いで使用する。

Get-Content はコマンドプロンプトの「type」や、Linux の「cat」のように、テキストファイルの内容を標準出力へ出力(表示)する。

Out-File は標準入力から受け取ったテキストを指定されたファイルへ書き込む。新規作成もする。

このコマンドレットはどちらも「-Encoding エンコーディング名」でエンコーディングを指定できる。

shift-jis から、utf-8 へ変換するなら以下のようにコマンドラインに入力する。

xxxxxxxxxx
Get-Content -Encoding shift-jis .text8.txt | Out-File -Encoding utf-8 .after8.txt

utf-8 から、shift-jis へ変換するなら以下のようにコマンドラインに入力する。

xxxxxxxxxx
Get-Content -Encoding utf-8 .text8.txt | Out-File -Encoding shift-jis .after8.txt

Out-File が作成するUTFファイルは「BOM有り」になる。

text8.txt への上書きは出来ない。

別のフォルダーへ同名のファイルを出力する事が多くなると思う。

一つ一つのテキストファイルを文字コード変換するだけなら、これで十分だと思う。

 

多数のテキストファイルを文字コード変換する場合

文字コード変換対象テキストファイルが多数ある場合は、一々コマンドレットを入力していられないと思う。

ワイルドカードで一括指定して、一括で文字コード変換するには、PowerShellスクリプトを作成する必要がある。

PowerShellの解説はこの記事ではできないので、サンプルスクリプトだけ掲載しておく。

[Convert-Encoding.ps1]ファイル

xxxxxxxxxx
function global:Convert-Encoding($input_filename,$input_encoding,$output_folder,$output_encoding){
    try {
        $filelist = Get-ChildItem -name $input_filename
        foreach($filename in $filelist) {
            $output_filename = Join-Path $output_folder  $filename
            Get-Content -Encoding $input_encoding $filename | Out-File -Encoding $output_encoding $output_filename
            Write-Host $filename
        }
        Write-Host "Successful."
    }
    catch {
        $errorstring = "Error : " + $_.Exception.Message
        Write-Host $errorstring
    }
}

コピペでこの[Convert-Encoding.ps1]ファイルを作成しておく。

そして、PowerShellのコマンドラインで関数定義を実行する。

xxxxxxxxxx
.Convert-Encoding.ps1

これで、そのPowerShellプロンプトだけで、Convert-Encoding関数が使用できるようになる。

別のPowerShellプロンプトでは使用できない。

Convert-Encoding関数のパラメータは以下のようになっている。

xxxxxxxxxx
[$input_filename] 読み込みファイル名(ワイルドカード使用可能)
[$input_encoding] 読み込みエンコーディング名
[$output_folder] 書き込み先のフォルダー名
[$output_encoding] 書き込みエンコーディング名

ファイルの上書きは出来ないので、読み込みファイルを「.before」フォルダーに配置し、書き込みファイルを「.after」フォルダーに出力するとする。

PowerShellのコマンドラインに次のように入力し、実行する。

utf-8 から、shift-jis へ変換

xxxxxxxxxx
Convert-Encoding .before*.txt utf-8 .after shift-jis

shift-jis から、utf-8 へ変換

xxxxxxxxxx
Convert-Encoding .before*.txt shift-jis .after utf-8

これで、ワイルドカードで指定したテキストファイルを一括で文字コード変換できるはずである。

 

PowerShellプロファイルへの登録

このままでは、Convert-Encoding を使用する度に、PowerShellプロンプトで「.Convert-Encoding.ps1」を実行して、関数定義をしなければならない。

これでは面倒なので、PowerShellプロファイルへConvert-Encoding を登録しておこう。

 

「Convert-Encoding.ps1」ファイルを適当な汎用フォルダーに配置する。

仮に「C:MySetting」に配置するとする。

 

PowerShellプロンプトで以下のコマンドを入力し、プロファイルが有効になっているか確認する。

xxxxxxxxxx
test-path $profile

有効であれば「True」が、無効であれば「False」が表示される。

 

無効であれば以下のコマンドで、プロファイルを作成し有効にする。

xxxxxxxxxx
new-item -path $profile -itemtype file -force

この時、フォルダーの場所とプロファイル名が表示される。

 

有効であれば既にプロファイルが存在するのでプロファイルを開き編集する。

ノートパッドでプロファイルを開く。

xxxxxxxxxx
notepad $profile

開いた、プロファイルに以下の行を書き込む。

xxxxxxxxxx
."C:MySettingConvert-Encoding.ps1"

そのまま上書き保存する。

 

PowerShellを再起動し、Convert-Encodingを動かしてみる。

例:

xxxxxxxxxx
Convert-Encoding .before*.txt utf-8 .after shift-jis

これで、PowerShellを起動したとき毎回 Convert-Encoding が使用できる状態になっている。

PowerShellスクリプトの管理や配布方法は色々あるらしい。

PowerShellGet プライベート リポジトリの操作

その他の方法

一般人が作成したフリーソフトを使用する事もできる。

ただ会社によっては、許可の無いフリーソフトは使用制限されることも多いだろう。

私がたまに使用するのは、「KanjiTranslator」だ。

文字コード変換ツール「KanjiTranslator」(フリーソフト)

GUI ソフトで IT が余り強くないユーザーに使わせるなら、これが単純で使いやすく、サポートが簡単になる。

他にも文字エンコーディング変換できるツールはあるが、試していないので紹介はしない。

 

私が以前作った「rmsmf」でも文字エンコーディング変換する事ができる。

本来は文字列置換するツールだが、文字コード変換だけに使う事もできる。

.net framework さえインストールされていれば、exe を環境変数PATHの通るフォルダーに配置しておけば動くので、管理は簡単になる。

rmsmf-複数ファイルの複数文字列を置換するコマンドツール
rmsmf:Replace Multiple Strings in Multiple Filesrmsmf は複数のテキストファイルに含まれる、複数の文字列を一括で置換できるコマンドツールです。前書き最近、GitHub を使い始めた。 これ

 

これらで満足いかない場合は、ご自分で探して頂く必要がある。

 

ユーザーの快適な文字コードワークを願って、ご武運を祈る。

 

この資料がお役に立てば幸いだ。

shift-jis と utf-8 の混在問題に関する記事(リンクリスト)に戻る

タイトルとURLをコピーしました