• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++ ハードウェアから文字列受信 文字化け)

C++初心者の困りごと!ハードウェアからの文字列受信で文字化けしてしまう問題

このQ&Aのポイント
  • C++初心者がJavaから呼び出したC++プログラムでハードウェアから文字列を受け取る際に文字化けが発生してしまう問題に困っています。
  • 現在の状況としては、C++プロジェクトのプロパティでマルチバイト文字を使用する設定をした上で、ハードウェアにコマンドを送信し、結果を文字列として取得しています。
  • しかし、取得した文字列が文字化けしてしまい、正常な結果を得ることができません。WideCharToMultiByteの使い方に問題がある可能性がありますが、解決策がわかりません。助けていただけると幸いです。

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

実行結果の >s3:1:19900309 からするとs3はWideCharToMultiByte()を使うまでもなくマルチバイトキャラクターだと思いますが。 s3がワイドキャラクターならprintf()ではまともに出力できませんから。 そこから考えるとcrwSendCommandRR()の使い方も間違ってそうな気がします。 >C++初心者のため大変困っております。 内容からするとC++はあんまり関係ないと思う(C++の機能ぽいのほとんど使われてないし) ひとまず ・ハードウェアから文字列受信 ・JNIを使ってCからJavaに文字列を渡す のをそれぞれに出来るようにしてから組み合わせた方がいいと思いますよ。

pokeman-v
質問者

お礼

ご回答ありがとうございます たしかに仕様書には BSTR* 32ビットの文字ポインタ としか書いてありませんでした。 どこかで勘違いをしていたと思います。 ありがとうございます。 ・ハードウェアからの文字列受信 ・JNIを使ってCからJavaに文字列を渡す どちらも簡易的に行いましたが BSTRが絡むと急にできなくなります。 BSTRについてもう少し調べてみようと思います ありがとうございます。

pokeman-v
質問者

補足

ああ・・・ わたしは何とバカなことを・・・ 以下のような簡単な処理で解決いたしました・・・ ご回答ありがとうございました。 やはりWideChartoなんたらは使う必要がなかったです。 ありがとうございました。 JNIEXPORT jstring JNICALL Java_rewritecard_JNI001_DT(JNIEnv *env, jobject obj) { BSTR s1 = ::SysAllocString(L"s1"); BSTR s2 = ::SysAllocString(L"s2"); BSTR s3 = ::SysAllocString(L"s3"); ret = crwSendCommandRR(4,1,10000,0,1,"DT",":1",2,&s1,&s2,&s3); printf("s3:\n", s3); printf("s3:%d\n", s3); printf("s3:%x\n", s3); printf("s3:%s\n", s3); //BSTR を char に変換---------------------------------------------- char* src = (char*)s3;   ←これだけ!!!!!!! printf("\nsrc:",src); printf("\nsrc:%d",src); printf("\nsrc:%x",src); printf("\nsrc:%s",src); jstring jstr = env->NewStringUTF(src); printf("\njstr:", jstr); printf("\njstr:%d", jstr); printf("\njstr:%x", jstr); printf("\njstr:%s", jstr); ::SysFreeString(s1); ::SysFreeString(s2); ::SysFreeString(s3); return jstr; } java側 1:19900309 C++側  s3: s3:1898084 s3:1cf664 s3:1:19900309 c: c:1898084 c:1cf664 c:1:19900309 check src: src:1898084 src:1cf664 src:1:19900309 jstr: jstr:66212024 jstr:3f250b8 jstr:弄$@ヌ#@ヌ#@ヌ#(CO

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

>以下のような簡単な処理で解決いたしました・・・ 解決したと思われてるようですが >char* src = (char*)s3;   ←これだけ!!!!!!! 上記で済んでWideCharToMultiByte()を使う必要がないということは crwSendCommandRR()は第11引数にBSTR*を要求してるにもかかわらずBSTRでないものを格納している(正しいBSTRならワイドキャラクタ文字列なのでWideCharToMultiByte()を使う必要がある)ということなので crwSendCommandRR()の処理がおかしいということになりますが・・・ crwSendCommandRR()を作成された方に仕様を確認した方がよいと思いますよ。

関連するQ&A