none
テキストエンコードの変換 RRS feed

  • 質問

  • お世話になります。

    下記は、指定されたファイルを指定されたエンコードで変換するための関数なのですが、
    注:テスト中なので、変換エンコードは固定(UTF-8)にしています。

    DetectCodepageInIStreamがS_FALSEを返して変換できません。

    S_FALSEは、

    S_FALSE The conversion specified is not supported on the system.

     

    らしいのでですが、現在の環境は、WINDOW7です。

    変換元のコードページは正しく取得されているのですが・・・
    教えてください。

    void CMojiHanbestu::ConvertEncoding(PCTSTR pcFilePath,PCTSTR pcDestFilePath)
    {
     ::CoInitialize(NULL);
     {
      CComPtr<IStream> spInStream;
      CComPtr<IStream> spOutStream;
      HRESULT hr = ::SHCreateStreamOnFile(pcFilePath,STGM_READ | STGM_SHARE_DENY_READ,&spInStream);
      if(SUCCEEDED(hr))
      {
       int scores=1;
       MultiLanguage::tagDetectEncodingInfo encoding[1];
       MultiLanguage::IMultiLanguage2Ptr p( __uuidof(MultiLanguage::CMultiLanguage));
       p->DetectCodepageInIStream(MLDETECTCP_NONE ,0,spInStream,encoding,&scores);

       //hr = ::CreateStreamOnHGlobal(0, TRUE, &spOutStream);
       hr = ::SHCreateStreamOnFile(pcDestFilePath,STGM_WRITE | STGM_SHARE_DENY_WRITE | STGM_CREATE | STGM_DIRECT,&spOutStream);


       DWORD mode = 0;
       UINT destCodePage = 65001;
       hr = p->ConvertStringInIStream(&mode, 0, NULL,encoding[0].nCodePage, destCodePage,spInStream, spOutStream);

      }
     }
     ::CoUninitialize();
    }

    2010年11月1日 4:07

回答

  • 確認です。

    >S_FALSE The conversion specified is not supported on the system.

     The method cannot determine the code page of the input stream.とMSDNには記載されています。

    それとも以下のPageとは異なるInterfaceでしょうか?

     

    [IMultiLanguage2::DetectCodepageInIStream Method]

      http://msdn.microsoft.com/en-us/library/aa740985(VS.85).aspx

     

    >変換元のコードページは正しく取得されている

    spInStreamを指していると思いますが、encodingに正しい値は入ってるということでしょうか?

     

     

    FileのByte数が少なくて判断できない可能性があります。

    そのFileのByte数はいくつでしょうか。

     

    試しにFileのByte数を512Byte以上になるように文字数を調整してから、Testしても同じ結果になりますか?

    それでうまく動作するなら、DetectCodepageInIStreamに失敗した場合は、Buffer Sizeを調整してDetectInputCodepageを利用すればよいでしょう。

     

    Buffer Sizeの調整とは、例えばFileの中身が"あいう"で9byteだった場合、"あいうあいうあいう・・・"と512byte以上になるように調整するということです。

    512Byteという閾値が適切かどうかは、Testして判断する必要があります。

    • 回答の候補に設定 山本春海 2010年11月15日 5:02
    • 回答としてマーク 山本春海 2010年11月25日 7:17
    2010年11月1日 10:52

すべての返信

  • 確認です。

    >S_FALSE The conversion specified is not supported on the system.

     The method cannot determine the code page of the input stream.とMSDNには記載されています。

    それとも以下のPageとは異なるInterfaceでしょうか?

     

    [IMultiLanguage2::DetectCodepageInIStream Method]

      http://msdn.microsoft.com/en-us/library/aa740985(VS.85).aspx

     

    >変換元のコードページは正しく取得されている

    spInStreamを指していると思いますが、encodingに正しい値は入ってるということでしょうか?

     

     

    FileのByte数が少なくて判断できない可能性があります。

    そのFileのByte数はいくつでしょうか。

     

    試しにFileのByte数を512Byte以上になるように文字数を調整してから、Testしても同じ結果になりますか?

    それでうまく動作するなら、DetectCodepageInIStreamに失敗した場合は、Buffer Sizeを調整してDetectInputCodepageを利用すればよいでしょう。

     

    Buffer Sizeの調整とは、例えばFileの中身が"あいう"で9byteだった場合、"あいうあいうあいう・・・"と512byte以上になるように調整するということです。

    512Byteという閾値が適切かどうかは、Testして判断する必要があります。

    • 回答の候補に設定 山本春海 2010年11月15日 5:02
    • 回答としてマーク 山本春海 2010年11月25日 7:17
    2010年11月1日 10:52
  • こんにちは、OTAKA さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

    ご質問の件、その後いかがでしょうか。
    kozz さんからの情報は確認されましたか?

    kozz さんからの情報は、問題の切り分けに有効であると思われましたので、勝手ながら私のほうで回答としてマークさせていただきました。
    kozz さん、情報ありがとうございます。

    もし、まだ問題が解決されていないようでしたら、詳しい状況とともにご質問を続けてくださいね。
    それでは、今後とも MSDN フォーラムをよろしくお願いいたします。
                                                                    
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2010年11月25日 7:17