• ベストアンサー

ConvertINetStringについて

wininetのInternetReadFileでUTF-8のサイトから文字列を受け取ったところ、2バイト文字が文字化けしていました。 ConvertINetStringでUTF-8からShift_JISに変換しようとしていますが上手くいかず困っています。 プログラムは下のようになっています。 DWORD mode = 0, readSize; char src[1024]; BYTE dst[1024]; int srcLen, dstLen; char c[1024]; while( true ) { readSize = 0; ::ZeroMemory(src, sizeof(src)); ::ZeroMemory(dst, sizeof(dst)); // 受信 InternetReadFile( hRequest, src, sizeof(src), &readSize ); if(readSize == 0) break; srcLen = strlen(src); dstLen = sizeof(dst) - 1; // UTF-8からShift_JISへ ConvertINetString(&mode, 65001, 932, src, &srcLen, dst, &dstLen); // BYTEからcharへ for(int i = 0; i < strlen(dst); i++) c[i] = (char)dst[i]; Console::WriteLine("受信:{0}", gcnew String(dst)); } 1.ConvertINetStringでdstに値がちゃんと入らない(「・」みたいなゴミのような文字が入ります) 2.本題とは逸れるのですが、BYTEからcharへの変換はこれでいいのでしょうか? ConvertINetStringが上手くいかない理由が特にわからないので回答をもらえたらありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

CLRで組むなら HttpWebRequest、HttpWebResponce、StreamReaderで読み取った方がいいのでは?   HttpWebRequest^ myReq = dynamic_cast<HttpWebRequest^>     (HttpWebRequest::Create( L"URLを記述" ) );   HttpWebResponse^ myRes = dynamic_cast<HttpWebResponse^>     (myReq->GetResponse());   IO::Stream^ strm = myRes->GetResponseStream();   Text::Encoding^ enc = Text::Encoding::GetEncoding( "utf-8" );   IO::StreamReader^ readStream = gcnew IO::StreamReader( strm, enc );   String^ ss = readStream->ReadToEnd();   Console::WriteLine( ss );   myRes->Close();   readStream->Close();   enc = Text::Encoding::GetEncoding("shift-jis");   IO::StreamWriter^ writeStream = gcnew IO::StreamWriter( L"sample04.txt", false, enc );   writeStream->Write( ss );   writeStream->Close();

その他の回答 (1)

回答No.1

まず、System::Stringは内部的にはUnicode(UTF-16)で扱うので、 Shift_JISに変換してからまたUnicodeにするのは無駄が多い。 (直接UTF-8→Unicodeにすべき) また、UTF-8の文字コードをすべてShift_JISコードに変換することは不可能だったと思います。 (1対1ではない。あらわせる文字の種類の差が結構あるはず。) .NET Frameworkを扱っているのであれば、System::Text::Encodingクラスを扱うとUnicodeの文字列を取得できると思います。 pin_ptrを使って、 (使ったほうがコードが簡単になるとおもう) >char src[1024]; array<BYTE>^ src = gcnew array<BYTE>(1024); pin_ptr<BYTE> psrc = &src[0]; >InternetReadFile( hRequest, src, sizeof(src), &readSize ); InternetReadFile(hRequest, psrc, src->Length, &readSize); System::String^ str = System::Text::Encoding::UTF8->GetString(src); とするとどうでしょうか? (動作検証はしていません。)

参考URL:
http://msdn.microsoft.com/ja-jp/library/744y86tc(VS.80).aspx

関連するQ&A