BOM付きのファイルの検索No.21590
マボカル さん 06/07/24 11:05
 
こんにちは。マボカルです。以前ユニコードファイルについてご相談
したときに出てきた事項と関連しますが、
http://www.maruo.co.jp/hidesoft/2/x20849_.html#20878

BOM付きのUTF16のファイルを「開かない状態で」探し出すことができる
でしょうか。Grep時のコードの自動認識の問題で、このBOMを付けるか
付けないかが統一されていないファイルが存在する可能性があるため、
大量のファイルの中から、そのファイルのみを抜き出してBOM付きに
統一したいと考えています。

上記リンク先では以下のように秀丸担当さんが親切にBOM付きかどうか
を確認する方法を説明してくれていますが、こうやってファイル一つ
一つを開いてバイナリモードで確認する方法しかないのでしょうか?

>BOMがあるかどうかは、バイナリで見たときにファイルの先頭に FF FE のコード
>があるかどうかで判断しますが、秀丸エディタで確認する場合は、[ファイル]→
>[開く]で実際に開いてみて開けるかどうかで判断すると早いかもしれません。
>BOMの確認の際には、自動認識の「Unicode(UTF-16)」のチェックは外した状態で
>確認してください。

できればGrepの文字列検索のように、特定のフォルダ内にあるファイル
を対象にBOMの有無を確認できる方法があればいいのですが・・。
何かいい方法がありましたら、どなたかご教授お願いいたします。

[ ]
RE:21590 BOM付きのファイルの検索No.21592
ENCODINGSHIFTJIS さん 06/07/24 11:59
 
  すぐ出来る、不完全な方法
Windowsコマンド findstr を使う

findstr /m  /s "" *.txt

””の中身 は バイナリの FEFF (リトルエンディアンBOM)

[ ]
RE:21592 BOM付きのファイルの検索No.21593
マボカル さん 06/07/24 14:04
 
ENCODINGSHIFTJISさん

ありがとうございます。

>  すぐ出来る、不完全な方法
>Windowsコマンド findstr を使う
>
>findstr /m  /s "" *.txt
>
>””の中身 は バイナリの FEFF (リトルエンディアンBOM)

一応ネットでコマンドの findstr について確認してもみましたが、
上手くいきません。というか結果が正しいのか正しくないのかも
はっきりしません。cd で目的のディレクトリ内に入って、findstr を
実行するのですよね。

findstr /m /s "" *.txt

で気になったことは、"" の中に何も書かないということでしょうか?
そのように入力すると検索文字列がありませんという結果になります。
"" は何も入れないのでしょうか?

>””の中身 は バイナリの FEFF (リトルエンディアンBOM)

この説明がよくわかりません。

もう少しヒントを与えていただけると理解できるような気がします。



[ ]
RE:21592 BOM付きのファイルの検索No.21594
秀丸担当 さん 06/07/24 14:06
 

V6.00βでは、ステータスバーにBOMの有無を表示できるようになったので、バイ
ナリモードにしなくてもファイルを普通に開いてみて確認することができます。

ファイルを開かず確認することはできないです。
grepで検索文字列「\xff\xfe」、正規表現ON、エンコードの種類をShift-JISと
することで、無理矢理BOMのあるファイルを一覧にして表示できるかもしれない
です。

[ ]
RE:21593 BOM付きのファイルの検索No.21595
ENCODINGSHIFTJIS さん 06/07/24 14:22
 
BOM.BAT を作ります、以下の一行
findstr /m  /s "" *.txt
次に、バイナリエディタで ””の中身を FEFF にして、保存
BOM.BATを コマンド実行します。

Cygwin 環境では unix コマンド
head -c2 BOM付き.txt| grep -e ""
の形で、先頭2バイトつまみ出し+判定できます。
””の中身は FE しか指定できなかった。
FF を入れるとコマンド解析段階で弾かれる。

PiowerShell とかも考えたが、時間がない。

[ ]
RE:21595 BOM付きのファイルの検索No.21596
ENCODINGSHIFTJIS さん 06/07/24 17:03
 
ダメなら 反対にします 、 FFFE
>次に、バイナリエディタで ””の中身を FEFF にして、保存

[ ]
RE:21595 BOM付きのファイルの検索No.21597
マボカル さん 06/07/24 17:57
 
ENCODINGSHIFTJISさん

詳しい説明ありがとうございます。

>BOM.BAT を作ります、以下の一行
>findstr /m  /s "" *.txt
>次に、バイナリエディタで ””の中身を FEFF にして、保存
>BOM.BATを コマンド実行します。

バッチファイルを作るということを理解していませんでした。そこで
やってみました。

findstr /m  /s "" *.txt を入力後、バイナリモードで開く。

66,69,6E,64,73,74,72,20,2F,6D,20,20,2F,73,20,22,
22,20,2A,2E,74,78,74,0D,0A,

22, と 22, の間に

FE,FF,

を入れて

66,69,6E,64,73,74,72,20,2F,6D,20,20,2F,73,20,22,FE,FF,
22,20,2A,2E,74,78,74,0D,0A,

として保存後、バッチファイルを実行。

対象となるファイルはサンプルとして以下の三つ。

Test_UTF16_NoBom.txt(UTF16ファイルBOM無し)
Test_UTF16_Bom.txt(UTF16ファイルBOM付き)
Test_UTF8_Bom.txt(UTF8ファイルBOM付き)

結果は以下の通り。

Test_UTF16_NoBom.txt
Test_UTF16_Bom.txt

はて?BOM付きでない Test_UTF16_NoBom.txt もヒットしてしまいま
した。

【疑問1】
上記バッチファイルでどうしてBOM付きでないファイルがヒットして
しまうのか。

【疑問2】
BOM付きの Test_UTF16_Bom.txt ファイルをバイナリモードで開いて
確認すると、ファイルの先頭は FE,FF, ではなく FF,FE, である。

【疑問3】
疑問2に関連して、ということは、バッチファイルの検索文字を、
FE,FF, ではなく FF,FE, にすればいいのかと思い、試してみたところ
コマンドのエラーが出ます。exit でも終了しないので、ウインドウの
×をクリックして終了。

【疑問4】
UTF8ファイルBOM付きの Test_UTF8_Bom.txt はきちんと検索されるのか
と思い、今度は EF,BB,BF, に書き換えてバッチファイル実行。これも
コマンドのエラーが出て、あえなく終了。

ENCODINGSHIFTJISさんが最初のご回答でおっしゃっていた

>  すぐ出来る、不完全な方法
>Windowsコマンド findstr を使う

の「不完全な方法」というのが妙に引っかかりますが、コマンドでは
上手く、完全に検索されないということなのでしょうか?

文字コードの深い部分はまだ未知の世界なので、ネットで色々勉強
しておきます。とりあえず現在までの状況を報告しておきました。
http://www.geocities.jp/h2fujimura/mutter/endian/bom.html

>Cygwin 環境では unix コマンド
>head -c2 BOM付き.txt| grep -e ""
>の形で、先頭2バイトつまみ出し+判定できます。
>””の中身は FE しか指定できなかった。
>FF を入れるとコマンド解析段階で弾かれる。
>
>PiowerShell とかも考えたが、時間がない。

この辺りになると、全く分かりません。Windowsのコマンドの理解でも
アップアップ状態です。

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

[ ]
RE:21594 BOM付きのファイルの検索No.21598
マボカル さん 06/07/24 18:18
 
秀丸担当さん

ご回答ありがとうございます。

>V6.00βでは、ステータスバーにBOMの有無を表示できるようになったので、バイ
>ナリモードにしなくてもファイルを普通に開いてみて確認することができます。

いつもステータスバーはOFFにしていたので、気づきませんでした。
これだとファイルを展開中はいつでも確認できますね。

>ファイルを開かず確認することはできないです。
>grepで検索文字列「\xff\xfe」、正規表現ON、エンコードの種類をShift-JISと
>することで、無理矢理BOMのあるファイルを一覧にして表示できるかもしれない
>です。

やってみたところ正確な結果が出ているようです。

Test_UTF16_NoBom.txt(UTF16ファイルBOM無し)
Test_UTF16_Bom.txt(UTF16ファイルBOM付き)
Test_UTF8_Bom.txt(UTF8ファイルBOM付き)

のファイルに対して、検索文字列「\xFF\xFE」では

Test_UTF16_Bom.txt(UTF16ファイルBOM付き)が、

検索文字列「\xEF\xBB\xBF」では

Test_UTF8_Bom.txt(UTF8ファイルBOM付き)が検索されました。

一つ質問ですが、このような方法の場合、エンコードの種類を
Shift-JIS にしないとだめなのはなぜですか?文字コードについて
しっかり理解するためには、この辺の仕組みを理解する必要がある
ように思えます。簡単に説明できるようでしたら、お願いしてよろしい
でしょうか。または参考になるURLでもお知らせいただければと
思います。





[ ]
RE:21598 BOM付きのファイルの検索No.21599
小西 さん 06/07/25 10:47
 
そういうことは、スクリプト言語が得意です。
単純にファイルの先頭にFE FFあるいはFF FEが来るかどうか調べたいのであれば、Ru
byでは

#!ruby.exe
# filename="chkbom.rb"

#Dir.glob( '**/*.*' ) do |f| #下層のフォルダも調べる場合
Dir.glob( '*.*' ) do |f|
 a = IO.read( f, 2, 0 ) #最初の2バイト読み込み
 if    (a[0] == 0xFF) && (a[1] == 0xFE)
  print f, "\tBOM\n"
 elsif (a[0] == 0xFE) && (a[1] == 0xFF)
  print f, "\tBOM\n"
 else
  print f, "\n"
 end
end

c:\>ruby chkbom.rb > chklist.txt
と書けます。

rubyは以下から手に入れるのが楽かと
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/

[ ]
RE:21597 BOM付きのファイルの検索No.21600
ENCODINGSHIFTJIS さん 06/07/25 11:11
 
findstr や grep は全テキストを走査します、パターンが発見できるまで。

head -c2 で先に 先頭の切り出しをすると正確です。

FFのようなコードはどの段階でも蒸発の危険性がある

いずれにしても、小コマンドを作らないと。
Visual C++ express =>無料ですが、PlatformSDKとかATLの設定とか、小プログラ
ム以上の手間がかかる。
PowerShellも C#環境作りのほうが汗かきます、今は夏休み入りで、掲示板も静か。

WSH、Perl、Cygwin、あたりで考える、検索してみてください。

Perl 5.8.x で BOM を扱う
http://hardsoft.at.webry.info/200606/article_2.html

[ ]
RE:21598 BOM付きのファイルの検索No.21601
秀丸担当 さん 06/07/25 11:36
 

>一つ質問ですが、このような方法の場合、エンコードの種類を
>Shift-JIS にしないとだめなのはなぜですか?文字コードについて
>しっかり理解するためには、この辺の仕組みを理解する必要がある
>ように思えます。簡単に説明できるようでしたら、お願いしてよろしい
>でしょうか。または参考になるURLでもお知らせいただければと
>思います。

自動判定のままだとと、BOMを認識します。(設定によりますが)
認識するとそのファイルはUnicodeのファイルとして解釈され、検索対象となる
のはBOMより後の文字になります。

強制的にShift-JISとすることで、FF FE という文字があると解釈されるため、
検索対象となります。

[ ]
RE:21600 BOM付きのファイルの検索No.21602
マボカル さん 06/07/25 14:17
 
ENCODINGSHIFTJISさん

ありがとうございます。

>findstr や grep は全テキストを走査します、パターンが発見できるまで。
>
>head -c2 で先に 先頭の切り出しをすると正確です。
>
>FFのようなコードはどの段階でも蒸発の危険性がある
>
>いずれにしても、小コマンドを作らないと。
>Visual C++ express =>無料ですが、PlatformSDKとかATLの設定とか、小プログラ
>ム以上の手間がかかる。
>PowerShellも C#環境作りのほうが汗かきます、今は夏休み入りで、掲示板も静か。
>
>WSH、Perl、Cygwin、あたりで考える、検索してみてください。
>例
>Perl 5.8.x で BOM を扱う
>http://hardsoft.at.webry.info/200606/article_2.html

参考にいたします。最近Perlを勉強しているので、その辺りの情報を
調べていきたいと思います。お付き合いありがとうございました。

[ ]
RE:21601 BOM付きのファイルの検索No.21603
マボカル さん 06/07/25 14:19
 
秀丸担当さん

>自動判定のままだとと、BOMを認識します。(設定によりますが)
>認識するとそのファイルはUnicodeのファイルとして解釈され、検索対象となる
>のはBOMより後の文字になります。
>
>強制的にShift-JISとすることで、FF FE という文字があると解釈されるため、
>検索対象となります。

なるほど。そういう仕組みだったのですね。よく理解できました。
ありがとうございました。

[ ]
RE:21599 BOM付きのファイルの検索No.21604
マボカル さん 06/07/25 14:24
 
小西さん

情報ありがとうございます。

>そういうことは、スクリプト言語が得意です。
>単純にファイルの先頭にFE FFあるいはFF FEが来るかどうか調べたいのであれば、R
>ubyでは
>
>#!ruby.exe
># filename="chkbom.rb"
>
>#Dir.glob( '**/*.*' ) do |f| #下層のフォルダも調べる場合
>Dir.glob( '*.*' ) do |f|
> a = IO.read( f, 2, 0 ) #最初の2バイト読み込み
> if    (a[0] == 0xFF) && (a[1] == 0xFE)
>  print f, "\tBOM\n"
> elsif (a[0] == 0xFE) && (a[1] == 0xFF)
>  print f, "\tBOM\n"
> else
>  print f, "\n"
> end
>end
>
>c:\>ruby chkbom.rb > chklist.txt
>と書けます。
>
>rubyは以下から手に入れるのが楽かと
>http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/

Rubyは使ったことがありませんが、文字コード対応の関係で使えるか
どうか試してみたいと思います。こちらの環境が韓国語版XPですので
Perlに関してもPerl5.8のUnicode対応になってから使えるように
なったもんですから。ありがとうございました。

[ ]
RE:21604 BOM付きのファイルの検索No.21605
小西 さん 06/07/25 15:07
 
>Rubyは使ったことがありませんが、文字コード対応の関係で使えるか
>どうか試してみたいと思います。こちらの環境が韓国語版XPですので
>Perlに関してもPerl5.8のUnicode対応になってから使えるように
>なったもんですから。ありがとうございました。
RubyのばあいI17Nについて議論の最中で、韓国語はまだ対応できていなかったと思い
ます。
上のスクリプトの場合、単純に先頭2バイトをバイナリで読み込んで比較するだけな
ので、文字コードは関係ないです。

[ ]
RE:21600 BOM付きのファイルの検索No.21606
ENCODINGSHIFTJIS さん 06/07/25 19:06
 
途中試作のメモのみ、__ は継続行

@REM BOM.BAT
@SET U=C:\CYGWIN\BIN\
@ECHO >V
@FOR %%f IN (*.TXT) DO __
@(@ECHO "%%f" >>V & @%U%HEAD.EXE -c2 %%f |%U%OD.EXE -h >>V)

>TYPE V
"jjj.TXT"
0000000 0a0d
0000002
"L.txt"
0000000 6f66
0000002
"log.txt"
0000000 feff
0000002

=============
考え方
頭を切り出し、16進ダンプのテキスト化、を、ファイル名と共に出力。

結果を GREP なりする。
FFFEを バイナリのまま扱わず、テキストに落とすと、テキストの住人
には扱いやすいかも。

HEAD.EXE, OD.EXE のコマンドが必要、UNIXコマンドのWIN化は MS-DOSの
昔からあります。全環境は不要。

[ ]