トップ回答者
テキストエンコードの変換

質問
-
お世話になります。
下記は、指定されたファイルを指定されたエンコードで変換するための関数なのですが、
注:テスト中なので、変換エンコードは固定(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();
}
回答
-
確認です。
>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して判断する必要があります。
すべての返信
-
確認です。
>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して判断する必要があります。
-
こんにちは、OTAKA さん。
MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
ご質問の件、その後いかがでしょうか。
kozz さんからの情報は確認されましたか?
kozz さんからの情報は、問題の切り分けに有効であると思われましたので、勝手ながら私のほうで回答としてマークさせていただきました。
kozz さん、情報ありがとうございます。もし、まだ問題が解決されていないようでしたら、詳しい状況とともにご質問を続けてくださいね。
それでは、今後とも MSDN フォーラムをよろしくお願いいたします。
マイクロソフト株式会社 フォーラム オペレーター 山本 春海