• ベストアンサー

【C&C++】EUC_JPをSHIFT-JISに変換したい

WinInetで指定したURLのHTMLを表示するコンソールプログラムを作成したのですが、EUC_JPで書かれたWebページが文字化けをしてしまいます。 SHIFT-JISで書かれているWebページは特に問題なく、自分もEUC_JPからSHIFT-JISに変換したいと考えています。しかし、色々と参考書やWebなどを調べてみたのですが、自分には少し難しすぎてより分かりやすい説明を求めています。 データの読み出しはInternetReadFileを使用しています。以下がそのソースです。 while (1) { InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead); szBuf[dwRead] = '\0'; if (dwRead == 0) break; str = str + szBuf; } どうかご回答よろしくお願いします。

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

 ん~ちょっと待って。QNo.1955793で同じ質問してるよね? その時も書こうかと思ったんだけど、難しいものは難しいなりに「ここまで理解できたけどここからが分かんない」ってのがあると思うのさ。  でないと、どこまで分かっているのかが分からないので、「え? 一から十まで説明しろって事?」となるよね。こっちも。  例えば、 ・EUC-JPとSJISって何ですか? ・エンコーディング(文字コード)って何ですか? ・実はEUC-JPとSJISのコード体系すら分からない ・EUC-JPは「JIS+あるビット」というのは理解した ・SJISとは、文字どおりJISをシフトしたものだという事は理解した ・JIS-SJIS相互変換を行えれば後は楽勝という事は分かった ・JIS→SJISでビットのシフト方法が分かった  どこでつまっているのかが私には分からないので・・・まさか原理から変換方法まで説明しろって言ってる訳じゃないでしょ?  かいつまんでEUCJP→SJIS変換の流れを説明すると、 1.ASCIIとEUCを検出して、ASCIIはそのまま流す、EUCは2以下の手順で変換 2.上位1ビットを落としてJISに変換 3.2バイトのJISを1バイトずつに分ける 4.上位バイトの範囲でマスクを変える 5.下位バイトの範囲でマスクとバイアス(元JISに足す数)を変える となるけど、つまずいてる場所は4か5だと思うんだよ。なので、せめてどこまで作ったかを示せば、回答が付きやすくなるだろうし、回答の正確さや精度もあがる。何を回答すれば良いか分かるからね。  難しいところもある程度までは自分で進めろって言っている訳じゃない(考えてみては欲しいけど)。別に1と2だけしかできてなくっても良いと思うんだ。「俺はここまで頑張った。次のステップには何をどうすれば良い?」って事だと思う。

happygocrazy
質問者

お礼

ありがとうございました。EUC_JP→SJIS変換の流れが参考になりました。これが基本的なやり方なのですね。 JavaやPerlで同様のプログラムを作ったことがあるのですが、このような方法でなく簡単だったのでもっと簡単にできるのかなと思っていました。簡単にやる方法として他人が作ったモジュールを利用することなのですね。 自分で書く方法としては、anmochiさんが示してくださったEUC_JP→SJISの流れでやればよいのですね。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

人の作ったライブラリを使う

参考URL:
http://tricklib.com/cxx/ex/babel/,http://icu.sourceforge.net/
happygocrazy
質問者

お礼

参考URL拝見しました。大変参考になりました。ありがとうございました。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.3

まあ、どうしてもプログラムでやりたいってのなら、実装コード自体は参考URLの様になりますが、 そもそも変換の実装すらしてないプログラム見せられて、答えを答えるのは間違ってる気がします。

参考URL:
http://www.net.is.uec.ac.jp/~ueno/material/kanji/euc2sjis.html
happygocrazy
質問者

お礼

C言語による文字コード変換において基本的なやり方というもの自体を知らなかったので、申し訳ありません。参考URLありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

前回の質問の際に、納得されたのでは?

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1955793
happygocrazy
質問者

補足

前回の説明で、メタタグの内容を見て文字コードを判別できるようにしました。正規表現を使いました。ただし、思ったより回答が得られなかったので新規の質問にすれば露出が増えると思い、一旦終了して再び質問をしてしまいました。申し訳ありません。以後いたしません。

関連するQ&A

  • 【C&C++】文字コードEUCをShift-JISに変換したい

    WinInetで指定したURLのHTMLを表示するコンソールプログラムを作成したのですが、EUCで書かれたWebページが文字化けをしてしまいます。 Shift-JISで書かれているWebページは特に問題なく、自分もEUCからShift-JISに変換したいと考えています。しかし、色々と参考書やWebなどを調べてみたのですが、自分には少し難しすぎてより分かりやすい説明を求めています。 データの読み出しはInternetReadFileを使用しています。以下がそのソースです。 while (1) { InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead); szBuf[dwRead] = '\0'; if (dwRead == 0) break; str = str + szBuf; } どうかご回答よろしくお願いします。

  • htmlソースを一文字ずつ取得するには・・

    私は猫でもわかるネットワークプログラミングをよんでふと思ったのですが・ HTMLソースを空白行も含め縦に並べたいのです たとえば・・ < h t m l > ってな感じで・・ つまりは printf("%s(%cでも・・)",一文字); ってな感じにしたいのです・・ 一応作りかけのソース張っておきます。。。。 wininet使ってます・・ //省略 //インターネット(wininet)開始 hInet = InternetOpen("ユーザー名収集プロトタイプ",INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL,0); hUrl = InternetOpenUrl(hInet,szUrl,NULL,0,0,0); //lpszSrcに1バイトのみ確保 hMem = GlobalAlloc(GHND,1); lpszSrc = (char *)GlobalLock(hMem); //読み出すものがなくなるまで読み出す while(1){ InternetReadFile( hUrl,szBuf,(DWORD)sizeof(szBuf) - 1,&dwRead); szBuf[dwRead] = '\0'; //読み出すものが無くなったらループを脱出 if (dwRead == 0){ break; } //必要バイト数の計算 dwTotal += dwRead; //確保領域の大きさ変更 hMem = GlobalReAlloc(hMem,dwTotal,GMEM_MOVEABLE); if(hMem == NULL){ perror("再アロケート失敗\n"); } lpszSrc = (char *)GlobalLock(hMem); if(lpszSrc == NULL){ perror("メモリ領域確保に失敗\n"); break; } strcat(lpszSrc,szBuf); printf("%s\n",szBuf); } //メモリの開放 GlobalUnlock(hMem); GlobalFree(hMem); //インターネットハンドルの開放 InternetCloseHandle(hUrl); InternetCloseHandle(hInet); return 0; }

  • EUC-JPをShift_JISに変えても大丈夫ですか?

    YahooのジオクリエイターでHPを作っていたら文字コードが<meta http-equiv="content-type" content="text/html; charset=EUC-JP">このようになっているんですが <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">に変えてしまっても問題ないんでしょうか? 複数ページがあって、いくつかのページだけEUC-JPで、ほかのページはShift_JISでした。 Shift_JISがメジャーと聞いたので全てのページの文字コードをShift_JISに変えてしまおうと思うんですが ほかのタグなど一切変えず文字コードだけ変えて、今まで普通に見れてたものが見えなくなったり、何か不具合が起こることはないんでしょうか? 今後、ジオクリエイター以外の環境でHPを作成・編集することもできるようにShift_JISで統一させておいたほうがいいですよね? よろしくお願いします。

    • ベストアンサー
    • HTML
  • jpgファイルのダウンロード

    WWWサーバー上にあるjpgファイルを指定してそれをダウンロードするプログラムをつくっています。 jpgファイルが作成されることはされるのですが、中身をみることができない状態になってしまいます。 どこが悪いのかわかる方がおられましたらご教授お願いします。 <ソースコード> #include <windows.h> #include <stdio.h> #include <wininet.h> int main(void) { HINTERNET hInet, hUrl; char szBuf[128], szUrl[128], *lpszSrc; DWORD dwRead, dwTotal = 0; HGLOBAL hMem; FILE *file; printf("URL---- "); gets(szUrl); hInet = InternetOpen(TEXT("neko"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hInet == NULL){ perror("オープンエラー\n"); return -2; } hUrl = InternetOpenUrl(hInet, szUrl, NULL, 0, 0, 0); if(hUrl == NULL){ perror("URLオープンエラー\n"); return -3; } hMem = GlobalAlloc(GHND, 1); lpszSrc = (char*)GlobalLock(hMem); while(1){ InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf)-1, &dwRead); szBuf[dwRead] = '\0'; if(dwRead == 0){ break; } dwTotal += dwRead; hMem = GlobalReAlloc(hMem, dwTotal+1, GMEM_MOVEABLE); lpszSrc = (char*)GlobalLock(hMem); strcat(lpszSrc, szBuf); } if((file = fopen("test.jpg", "wb")) == NULL){ printf("ファイルオープンエラー\n"); goto end; } while(dwTotal){ fputc(*lpszSrc, file); lpszSrc++; dwTotal--; } fclose(file); end: GlobalUnlock(hMem); GlobalFree(hMem); InternetCloseHandle(hUrl); InternetCloseHandle(hInet); return 0; } <環境> Windows Vista VC++ 2005 EE

  • 「shift_jis」と「EUC-JP」

    「shift_jis」と 「EUC-JP」 で書かれている「別べつ」のページ間で、 タグや構文を、コビーして使ってもいいんでしょうか? ---------------------------------------------------- ホームページビルター8で、それぞれ、タグや構文を見ると、 文字化けもなく見えるので、普通にコピーして使ってもいいでしょうか?

    • ベストアンサー
    • HTML
  • EUC-JP文字コードについて

    おはようございます。 WEBサイトのソースから文字列を確認するとほとんどが「シフトJIS」ですが、まれに「EUC-JP」のサイトを見つけます。 これはWEBサイトを作成した環境がユニックスだからでしょうか?? もしくは、なんらかの事情で意図的に「EUC-JP」で保存しているのでしょうか?? よろしくお願いします。

  • Shift-JISからUTF-8への変換が出来ません

    初歩的な質問で申し訳ありませんが、大変困っております。ただいまimagettftext()を使って日本語主力したく悪戦苦闘しております。  ページ自体はShift-JISで制作していますのでimagettftext()で日本語を出力する場合はUTF-8へ変換して出力するところまでは知れべていて分かりました。しかしいざmb_convert_encoding()で変換しようとするとなぜかUTF-8へ変換されません。 $str = mb_convert_encoding($str,"UTF-8","SJIS"); print mb_detect_encoding($str);  結果→SJIS しかしこれがEUC-JPなら変換されます。 $str = mb_convert_encoding($str,"EUC-JP","SJIS"); print mb_detect_encoding($str);  結果→EUC-JP なぜなのか原因が分からなく困っております。 どなたかご教授願いませんでしょうか? よろしくお願い致します。

    • 締切済み
    • PHP
  • InternetOpengaが使えません・・・。

    すみません。 どーしてもできません。教えてください。 下記のプログラムを走らせたいのですが、エラーが直りません。 開発環境はVC++2008です。 プロジェクト新規でwin32コンソールアプリケーションを選択し、 空のプロジェクトを作成したあと、 WinInet.Libを追加しています。 下記のプログラムで、下記のようなエラーがでます。。。、 ------ ビルド開始: プロジェクト: readhtml, 構成: Debug Win32 ------ コンパイルしています... readhtml.cpp warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(279) : 'gets' の宣言を確認してください。 error C2664: 'InternetOpenW' : 1 番目の引数を 'const char [16]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 error C2664: 'InternetOpenUrlW' : 2 番目の引数を 'char [128]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 readhtml - エラー 2、警告 1 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== ある本を見ながら、作成し、サンプルどおりに作っているのですが・・。 #include <windows.h> #include <stdio.h> #include <wininet.h> int main() { HINTERNET hInet,hUrl; char szBuf[128],szUrl[128],*lpszSrc; DWORD dwRead,dwTotal = 0; HGLOBAL hMem; //目的のURLの入力 printf("URL---"); gets(szUrl); //インターネット(WinInet)の開始 hInet = InternetOpen("nekodemo-wakaru", INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL,0); if (hInet == NULL){ perror("オープンエラー\n"); return -2; } //HTTPセッションの開始、指定のURLオープン hUrl = InternetOpenUrl(hInet,szUrl,NULL,0,0,0); if (hUrl == NULL){ perror("URLオープンエラー\n"); InternetCloseHandle(hInet); return -3; } //lpszSrcに1バイトのみ確保 hMem = GlobalAlloc(GHND,1); lpszSrc = (char *)GlobalLock(hMem); //読み出すものがなくなるまで読み出す while(1){ InternetReadFile( hUrl, szBuf, (DWORD)sizeof(szBuf) - 1 , &dwRead); szBuf[dwRead] = '\0'; //読み出すものがなくなたのでループ脱出 if (dwRead == 0){ break; } //必要バイト数の計算 dwTotal += dwRead; //確保領域の大きさ変更 hMem = GlobalReAlloc(hMem, dwTotal + 1, GMEM_MOVEABLE); if (hMem == NULL){ perror("再アロケート失敗\n"); } lpszSrc = (char *)GlobalLock(hMem); if (lpszSrc == NULL) { perror("メモリ確保に失敗\n"); break; } strcat(lpszSrc,szBuf); } //ソースの表示 printf("%s\n",lpszSrc); //メモリの開放 GlobalUnlock(hMem); GlobalFree(hMem); //インターネットハンドルの開放 InternetCloseHandle(hUrl); InternetCloseHandle(hInet); return 0 ; }

  • EUC →Shift_jisへのコンバート

    Postgres+PHPでサイトを運営しております 文字セットをすべてEUC-JPで統一していたのですが そこにモバイル用のページを追加することになりました サーバ環境を変えずにやるために モバイル用のページだけ EUCで吐き出すページを一括してshift_jisにコンバートするような 方法はないものかと思っております または やはりPHPやPOSTGRESの環境ごと変えてしまうべきなのでしょうか

    • 締切済み
    • PHP
  • JAVAでのShift-JISとEUC-JP間の文字コード変換ができません

    Windows環境で作成した「Shift-JIS(CP932)」のファイルを、 JAVAを使用して「EUC-JP」のファイルに変換したいのですが、 NEC選定文字(13区)等の追加された機種依存文字の変換ができません。 いろいろ調べてみたのですが、 文字コードの呼び方がサイトによってあいまいで、 どのページが正しいのかがわかりません。 ・「Shift-JIS(CP932)」「EUC-JP」の正確な情報が記述されたサイト ・JAVAにおける文字コードの変換のノウハウ に関しての知識をお持ちの方がいましたら、教えてください。 以下は変換に使用したJAVAのソースコードです。 InputStreamReader ins = new InputStreamReader(new FileInputStream(iFile), "windows-31j"); OutputStreamWriter outs = new OutputStreamWriter(new FileOutputStream(oFile), "euc-jp"); int c; while ((c = in.read()) != -1) { out.write(c); } 以上です。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう