nkf や PowerShell で文字コード変換

2020年9月21日月曜日

システム開発 技術的備忘録 汎用ソースコード&ツール

t f B! P L


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 をダウンロードして適当なフォルダーに配置する。

https://www.vector.co.jp/soft/win95/util/se295331.html

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

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

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

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

使用方法、

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

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

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

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

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

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

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

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

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

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

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

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

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

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

BOMなし

BOM有り

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

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

https://www.atmarkit.co.jp/ait/articles/1609/29/news016.html

 

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 へ変換するなら以下のようにコマンドラインに入力する。

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

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

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

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

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

 

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

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

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

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

[Convert-Encoding.ps1]ファイル

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

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

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

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

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

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

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

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

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

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

 

PowerShellプロファイルへの登録

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

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

 

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

例:

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

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

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


その他の方法

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

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

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

https://www.kashim.com/kanjitranslator/

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

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

 

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

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

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

https://www.wake-mob.jp/2020/07/rmsmf.html

 

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

 

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

 

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


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


このブログを検索

Translate

人気の投稿

自己紹介

自分の写真
オッサンです。実務経験は Windows環境にて C#,VB.NET ,SQL Server T-SQL,Oracle PL/SQL,PostgreSQL,MariaDB。昔はDelphi,C,C++ など。 趣味はUbuntu,PHP,PostgreSQL,MariaDBかな ?基本無料のやつ。

QooQ