[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]
まずcurlライブラリを使ってHTMLファイルを取り込みます。
文字コードがシフトJISであってもMicrosoftの拡張シフトJISの場合はCP932を使わないと文字化けを起こします。
#include <curl/curl.h>
#include <iconv.h>
std::string ConvertShiftJISToUTF8(const std::string& input) {
std::string output;
iconv_t cd = iconv_open("UTF-8", "CP932"); // SHIFT-JISではエラーになった
if (cd == (iconv_t)-1) {
std::cerr << "Error: Failed to open iconv" << std::endl;
return output;
}
size_t inBytes = input.size();
size_t outBytes = inBytes * 4; // 変換後の最大バイト数を予測して確保する
char* inBuf = const_cast<char*>(input.c_str());
char* outBuf = new char[outBytes];
char* outPtr = outBuf;
if (iconv(cd, &inBuf, &inBytes, &outPtr, &outBytes) == (size_t)-1) {
std::cerr << "Error: Failed to convert encoding: " << strerror(errno) << std::endl;
delete[] outBuf;
iconv_close(cd);
return output;
}
output.assign(outBuf, outPtr - outBuf);
delete[] outBuf;
iconv_close(cd);
return output;
}
int main() {
// URLからHTMLファイルを取り込む
std::string url = "HTMLファイルのURL";
std::string htmlBuffer;
CURL* curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &htmlBuffer);
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (res != CURLE_OK) {
std::cerr << "Error: Failed to download HTML" << std::endl;
return 1;
}
} else {
std::cerr << "Error: Failed to initialize CURL" << std::endl;
return 1;
}
// 文字コードをCP932(Microsoftの拡張Shift-JIS)からUTF-8へ変換
htmlBuffer = ConvertShiftJISToUTF8(htmlBuffer);
// htmlBufferの確認
cout << "htmlBuffer: \n" << htmlBuffer << endl;
<以下略>