◀ANSI版開発トップへ
  • 3659 officeファイルの判別
    • 3663 Re: officeファイルの判別
      • 3668 Re2: officeファイルの判別
  • [3659] officeファイルの判別 maru 2004年07月08日 20:13

    お世話になっております。
    以前一般掲示板の方で書き込みさせていただいた件で
    どうしてもあきらめきれず、自分で何とかしてみました。
    仕事上、Wordファイルを対象にGrep実行する頻度が高く
    あったら便利そうだったので。

    とはいえ、いきなり業務で使うにはちょっと勇気がいるので
    恥かしながら、こちらでソースを掲示させていただきました。
    ヤバそうなら、どなたかコメントを頂けると幸いです。

    ファイル先頭にOffice文書のヘッダー
    D0-CF-11-E0-A1-B1-1A-E1 があれば
    有無を言わさずUNICODEという少々乱暴な仕様ですが
    素人目にはうまく動作しているように見えます・・・。

    //CMemory::IsUnicodeBom()に追加
    if( 8 <= nBufLen ){ //OfficeヘッダーがあればUNICODE
    if( pBuf[0] == (unsigned char)0xd0 &&
    pBuf[1] == (unsigned char)0xcf &&
    pBuf[2] == (unsigned char)0x11 &&
    pBuf[3] == (unsigned char)0xe0 &&
    pBuf[4] == (unsigned char)0xa1 &&
    pBuf[5] == (unsigned char)0xb1 &&
    pBuf[6] == (unsigned char)0x1a &&
    pBuf[7] == (unsigned char)0xe1 ){
    return CODE_UNICODE;
    }
    }
    • [3663] Re: officeファイルの判別 もか 2004年07月09日 21:52

      >//CMemory::IsUnicodeBom()に追加
      >if( 8 <= nBufLen ){ //OfficeヘッダーがあればUNICODE
      > if( pBuf[0] == (unsigned char)0xd0 &&
      ...中略
      > pBuf[7] == (unsigned char)0xe1 ){
      > return CODE_UNICODE;
      > }
      >}
      IsUnicodeBomで判定させると、CFileLoadが読み込んだ時点で先頭2バイトを削除してしまうため、CMemory::CheckKanjiCodeに直接書くか、CheckCodeOfSignatureのようなメンバを追加した実装したほうがいいと思います。
      Grepするだけなら問題なしです。

      ちなみに、FindFastとかWord内の[ファイル]-[検索]はどうなんでしょう。
      • [3668] Re2: officeファイルの判別 maru 2004年07月10日 20:00

        ▼ もかさん
        レスありがとうございます。

        > 先頭2バイトを削除してしまう
        削除している場所よくわかりませんでした(^^;;

        > CheckCodeOfSignatureのようなメンバを追加した実装したほうが
        ほとんどgrepするだけなのですが、一応「メンバを追加」の方法で
        あまり自信ないですが、動くようになりました。

        > ちなみに、FindFastとかWord内の[ファイル]-[検索]
        sakuraを使うと、grepでマッチした行を
        一画面で見渡せるため何かと都合が良いのです。
        文字列「使用者名」とかでgrepし
        結果ログに対して直接、正規表現を使って置換して
        名前だけの一覧を抽出する場合などです。
        我ながら下手な説明です・・・。

        ともかく、たびたびのアドバイスありがとうございます。