2017-10-22 37 views
-2

私が作業しているCプロジェクトがあり、問題があります。 プログラムは.phpページによってエコーされる文字列を読み込みます。あなたがデータを受信するコマンド()関数に送られ、見ることができるようにLPBYTEをchar *などのC(中国語の出力)に変換することで苦労します

LPSTR szBuffer=(LPSTR)chunk+0x1000; 
DWORD dwRead; 

if (CWA(_HttpSendRequestA, wininet, hHttpRequest, szHeaders, lpstrlenA(szHeaders), szReq, lpstrlenA(szReq)) != 0) 
    { 
     CWA(_InternetReadFileA, wininet, hHttpRequest, szBuffer, 0x400, &dwRead); 
     if (dwRead) 
      Commands((LPBYTE)szBuffer, dwRead); 
    } 

:これは、データを読み込み、コマンド()関数に送信されます変数、それを任命し、このコード を使用していますLPBYTE szBuffer(関数内の "command"という名前)とDWORD dwRead(関数内で "size"という名前)を使用します。

Commands()関数では、読み込んだ文字列を.phpページから読み込むことになっています。しかし、データはLPBYTEとして保存されているように見えるので、char *にそれを取得しようとすると多くのことをやったことがあります。私が最終的にそれを得たと思ったとき、私はMessageBoxを使ってそれを出力しようとしました。元の文字列は、このする必要がありながら、しかし、これは(私の中国語の文字を返します。

「TASKci = 0C73CCFD206BBD011E7087CE0806E6F6E69630、仕事= dlex、TI = AD62A5950B76F3812C542C24040EACE9、PR = HTTPS、ウル= // test.com/test.txt,cl 。それは私を返すものの=」

スクリーンショット:http://prntscr.com/h0p5iw

コマンド内のコードは()どのように見えるか:

BOOL Commands(LPBYTE command, DWORD size) { 

LPTSTR x = (LPTSTR)((char*)command); 

{ 

     int msgboxID = MessageBox(
     NULL, 
     x, 
     (LPCWSTR)L"Woop",  
     MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2); 

} 


CWA(Sleep, kernel32, 100); 

return 1; } 

私はCで新たなんだ(私はC#でものを書きました前に)私は残念なことに質問をしている場合、私は残念です私は本当にベストを尽くしましたが、自分で解決策を見つけられないようです。

また、Commands()機能の中のものを除いてすべてが私によってコード化されているのではなく、より経験豊富な人によってコード化されていることに注意してください。そのコードはうまくいくはずですし、ページからデータを読み込んでいると確信しています。おそらく、どこかの変換をねじ込んでいるのでしょう。

+0

「LPSTR szBuffer =(LPSTR)チャンク+ 0x1000」とは何ですか?あなたは 'char szBuffer [0x1000] = {0}'を意味しますか?これらのCWA機能は何ですか?あなたのプロジェクトはUnicodeだと思われますが、ANSI関数を強制しています。あなたは '(LPTSTR)'キャストでいくつかのエラーを隠しています。 WinAPI関数、例えば 'HttpSendRequest'を使うべきです。または 'HttpSendRequestA'とANSIを強制したい場合。あなたのコードには、マクロ、キャスト、および非定型コードが多数含まれています。 'LPTSTR'や他の' T'マクロは、初心者には非常に混乱しますので、避けてみてください。 –

+0

彼らが選んだ文字エンコーディングについて経験豊富な人に尋ねてください。 'MultiByteToWideChar'を使ってワイド文字列に正しく変換することを知る必要があります。 [すべてのソフトウェア開発者が絶対に最低限必要な絶対最小、Unicodeと文字セットについて肯定的に知っておく必要があります(言い訳はありません!)](https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-すべてのソフトウェア開発者 - 絶対に積極的に - 知っておきたい - 約 - ユニコードとキャラクターセット - 言い訳なし) – IInspectable

+0

タイプミスマッチエラーに対するあなたの現在のアプローチは、AがタイプBでなくても、AをBにキャストすることによってコンパイラに頼っているようです。これは決してうまくいかない。コンパイラエラーを理解しようとする必要があります。それらを無視しないでください。 –

答えて

3

幅の広いUTF-16 Unicode文字列が必要などこかで使用すると、狭い文字列(char *)tends to look like Chineseが使用されます。

文字列をキャストして型を変更することはできません。MultiByteToWideCharに電話する必要があります。

+0

また、ソース文字列がANSIエンコーディング(スレッドの現在のコードページを使用)またはASCIIエンコーディングを使用する場合は、 'MessageBoxA'を呼び出して変換を実行させます。 – IInspectable

関連する問題