質問する質問する
 

質問Unicodeファイルの判別 

  • 2009年10月29日 2:06TAKAKUN ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    お世話になっております。

    あるディレクトリにある、テキストファイル群でunicode形式で保存されている
    ファイル一覧を取得することになり、条件は下記の内容となりました。

    ・utf-8,utf-16のもの
    ・但しBOMで判断できるものでよい

    powershellで、簡単に作成できると思い試みたのですが、
    なかなかうまいコマンドの組み合わせが思いつきませんでした。
    (※私が「簡単」と思っているレベルは、メソッドを作成せず、
      既存のコマンドレット等使用してパイプつなぎでの一行でできる内容です。)

    で、結局、時間がなくメソッドを作成し(といっても大した内容ではないですが、)
    抽出できたのですが、こういう内容を、メソッド以外で行う場合の方法ってありますでしょうか。

    あらかじめ変数に BOMをいれておいて・・・ 比較できればって発想だったんですが・・・

     

    ちなみに作成した関数の内容と利用したコマンドは、下記のとおりです。。

    Name        : isunicodetext
    CommandType : Function
    Definition  : param([io.fileinfo]$file) $bom = @(gc $file -Encoding byte | select -First 3)
                  ($bom[0] -eq 0xef -and $bom[1] -eq 0xbb -and $bom[2] -eq 0xbf) -or ($bom -contains 0xfe -and $bom -contai
                  ns 0xff)

    ls -Recurse -Include *.txt | ?{isunicodetext($_)}

     

すべての返信

  • 2009年11月4日 13:46HIROsDotNetMVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     コードあり

    コマンドレットで実現するのは難しそうなので StreamReaderを使用する方法を考えてみました。

    ls -recurse -Include *.txt | %{$sr = New-Object System.IO.StreamReader($_); if($sr.CurrentEncoding.BodyName -eq "utf-8" -or $sr.CurrentEncoding.BodyName -eq "utf-16"){#ここに処理内容を記述};$sr.Close()}

    StreamReader には CurrentEncoding というプロパティががあり、さらに BodyName プロパティを使用することで utf-8 や utf-16 といった情報を取得することができます。

  • 2009年11月5日 5:50TAKAKUN ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    ご返事ありがとうございます。

    さっそく試してみたのですが、Shift-JISのエンコードのテキストファイルは、utf-8と表示されます。。。


    PS C:\..\Downloads> $sr = New-Object System.IO.StreamReader($(join-path (gl) "shiftjis.txt"));
    PS C:\..\Downloads> $sr.CurrentEncoding.BodyName
    utf-8
  • 2009年11月5日 10:21HIROsDotNetMVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    HIROです。

    TAKAKUNさんが示されたコードで試してみましたが、自分の環境でも同様にutf-8と判定されました。
    調べてみたところ MSDN に「StreamReaderRead メソッドを最初に呼び出した後、現在の文字エンコーディングを示す値が異なる場合があります」との記述がありました。

    そこでReadメソッドを実行した後に $sr.CurrentEncoding.BodyName を実行してみたのですが、それでも utf-8 と判定されてしまいました。

    現在のところ TAKAKUNさんが最初に示されたコードがベストかと思われます。

    お騒がせしてすみません。

    新たに情報を入手したら、また返信させていただきたいと思います。
  • 2009年11月6日 1:17TAKAKUN ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    ご返事ありがとうございます。

    正直言いますと、条件に挙げた項目の中の「BOMで判断できるもんでよい」は、妥協でした。
    実際のテキストファイル群でUnicodeのものは、BOMを付けていないものも少なからずあり・・・

    いろいろ試していただいている思われ、感謝します。

    ありがとうございました。