Windows TIPS
[Scripting]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

ファイルの文字コードを変換する

解説をスキップして操作方法を読む

山田 祥寛
2003/07/19
 
対象OS
Windows NT
Windows 2000
Windows XP
Windows Server 2003
指定されたフォルダの下に存在するテキスト・ファイルの文字コードを一括で変換したいことがある。
このためには、文字コード変換用のコンポーネットをWSHから呼び出せばよい。
 
解説

 Windows OSや、UNIX/Linuxなど、マルチプラットフォーム環境で作業を行っている場合、文字コードの差異に悩まされる状況は少なくない。例えば、Windows環境で作成したソース・コードをUNIX/Linux環境で動作させるようなケースでは、いちいちShift_JISで記述したコードをEUC-JPに変換するなどの必要がある。

 しかし本サンプルを用いることで、特定のフォルダ配下に納められたテキスト・ファイルの文字コードを一括で変換することができる。フォルダ配下のサブフォルダまで再帰的に処理されるため、対象ファイルの指定もシンプルだ。あるプロジェクトに属するファイル一式を、一気に変換したいという場合などに威力を発揮するだろう。

 なお本TIPSを利用するには、Basp21という、メール送信/コード変換用の追加コンポーネントがコンピュータにインストールされていることが条件となる。コンポーネントBasp21に関する入手先やインストール方法などについては、別稿の「TIPS―配信リストを使ってメールをいっせいに配信する」の「手順1」を参照してほしい。


操作方法

手順1―テキスト・エディタでスクリプトのコードを入力する

 まずはテキスト・エディタ(メモ帳でもなんでもよい)を開き、以下のコードを入力して欲しい。なお、引用符(')で始まる行はコードの概要を解説するためのコメント部分なので、省略してもかまわない。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="KConvert">
<?job error="True" debug="True" ?>
<object id="objBsp" progid="Basp21" />
<object id="objFs"  progid="Scripting.FileSystemObject" />
<script language="VBScript">
<![CDATA[
Sub FileConvert(strPath)
  Set objFld = objFs.GetFolder(strPath)
  For Each objFl In objFld.Files
    strTmp=objFl.Path
    If objFl.Size>0 Then objBsp.KconvFile strTmp,strTmp & ".tmp",2,1
    objFl.Delete
    objFs.MoveFile strTmp & ".tmp",strTmp
  Next
  ' 現在のフォルダ配下に存在するファイル(objFld.Files)に対して、文字コード
  ' の変換処理(Basp21#KconvFilesメソッド)を行う。ただし、対象のファイル
  ' が空(0バイト)の場合には、KconvFileメソッドは失敗するので、あらかじめ
  ' 取り除いておくものとする。
  ' 変換後は元のファイルを削除し、KconvFileメソッドによって生成された「元の
  ' ファイル名.tmp」を元のファイル名で保存し直す
  For Each objSub In objFld.SubFolders
    FileConvert objSub.Path
  Next
  ' 現在のフォルダ配下に存在するサブフォルダ(objFld.SubFolders)に対して
  ' 再帰的にFileConvertプロシージャ(自分自身)を呼び出す。これによって、
  ' 複数の階層フォルダに対しても、一度で変換処理が行える
End Sub
FileConvert WScript.Arguments.Item(0)
  ' 上で定義されたFileConvertプロシージャに、ドラッグ&ドロップで渡された
  ' フォルダのパスを引数として渡し、実行する
]]>
</script>
</job>
</package>

 WSHの実行ファイルは拡張子「.wsf」(Windows Scripting host File)とする必要がある。ファイル名自体は何でもよいが、ここでは「kconv.wsf」という名前で保存しておく。

手順2―WSHのコードを実行する

 kconv.wsfを実行するには、エクスプローラでkconv.wsfの格納されたフォルダを開いておき、そのアイコン上に置き換え対象のファイルが納められた「フォルダ」をドラッグ&ドロップするだけだ。だがこのkconv.wsfは複数フォルダの変換には対応していないので、複数フォルダを指定した場合には、最初のフォルダだけが処理される。注意してほしい。

 本稿の例では、フォルダ中に含まれるすべてのファイルがShift_JISコードからEUC-JPコードに変換される。ファイルの文字コードを変換するKconvFile関数は次のようにして利用する。

objBsp.KconvFile(元のファイル名,変換後のファイル名,変換後の文字コード,変換前の文字コード)

 第1、第2引数には変換するファイル名を指定し、第3、第4引数には文字コードを指定する。指定できる文字コード(の数値)は以下の通りである。

文字コード
0
任意(変換前)、変換せず(変換後)
1
SHIFT_JIS
2
EUC-JP
3
JIS
4
UNICODE UCS-2
5
UNICODE UTF-8
KconvFileメソッドにおける文字コード指定
変換前の文字コードを第4引数に、変換後の文字コードを第3引数にそれぞれ指定する。

 第4引数に0を指定した場合には、変換前の文字コードは自動判定されるが、「Shift_JISで半角カナのみ」「漢字の数が少ない」「UTF-8」の場合などに文字コードの自動認識に失敗する場合があるので、可能な限り明示的に与えることが好ましい。

 なお本稿では割愛するが、例えば「TIPS―複数ファイルの文字列置換をワンクリックで行う」と併用することで、より強力な変換スクリプトの可能性が見えてくる。また、ちょっとした変更で複数フォルダへの対応も可能だろう。

 まだまだ応用の可能性はあるので、次の機会にはさらに活用してみたい。どうぞお楽しみに。End of Article

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間