ソケット通信を利用してデータを送信した際に、
データの一部が文字化けしてしまって困っています。

Cのプログラム内でデータを作成し、
writeを使用してソケットディスクリプタに書き込んでます。
デーモンを介してJavaのプログラムに送信しているのですが、
writeする直前では正常なデータなのに、
Java側で受信すると一部の文字が化けてしまうことがあります。
原因とかぜんぜんわからなくて、かなり困ってるのですが、
わかる方いらっしゃいましたら教えてくださぁ~~~いっ!
お願いします!!!

ちなみに、送信しているデータは構造体です。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

あまりに抽象的すぎます。


どのようなデータを送信して、どのような結果が得られて、どこかまずいのか。
また、送受信するソースコードはどのように書いているのか、
それくらいは質問する際に記述すべきです。

この回答への補足

ごめんなさい。こうゆーの使うの初めてなので
なんて書いたらいいのかわからなかったです。

送信するデータは
”茨城支店サーバ\a神奈川支店サーバ\a東京支店サーバ\a・・・”
とゆー感じで、\aで区切られたデータがいくつか連なっています。

このデータをwriteを使用して
下記のようにソケットディスクリプタに書き込んでます。


memset(ret_data1.req_data,'\0',WORKSIZE - sizeof(long) * 2);
memcpy(ret_data1.req_data,send_data->req_data,size);
ret_size = write(sock_d,(char *)&ret_data1,WORKSIZE);
if(ret_size < 0) {
return NG;
}


上記のsend_data->req_dataにデータが格納されてます。

このようにしてデータを送信したときに、
Javaの方で受信すると、複数あるデータの一部
(例えば、”神奈川支店サーバ”だけとか)が
文字化けしてしまいます。
Java側では受信するデータの数を想定していて、
文字化けにより、二つのデータが一つになってしまい、
データ数が一致しないため、エラーと判断されます。

Java側の受信しているソースがわからないので、
どのようにして受け取っているのかがわかりません。

コレだけじゃわからない・・・ですよね。。。

補足日時:2002/03/26 13:48
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字化けメールの修復方法は?

文字化けメールが届いてしまいました。
エンコードの問題ではないようです。修復する方法はありますか?

Aベストアンサー

以下のHPで、もしかしたら読めるかもしれません。

参考URL:http://www.kanzaki.com/docs/jis-recover.html

QCプログラム UDP送信の送信データに関して

以下の2つのプログラムでの質問なのですが、

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in addr;

WSAStartup(MAKEWORD(2, 0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);

addr.sin_family = AF_INET;
addr.sin_port = htons(3054);
addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 ");

sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr));

closesocket(sock);
WSACleanup();

return 0;
}





#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in addr;

WSAStartup(MAKEWORD(2, 0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);

addr.sin_family = AF_INET;
addr.sin_port = htons(3054);
addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 ");

sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));

closesocket(sock);
WSACleanup();

return 0;
}

について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか?
¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか?

また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。

以下の2つのプログラムでの質問なのですが、

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in addr;

WSAStartup(MAKEWORD(2, 0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);

addr.sin_family = AF_INET;
addr.sin_port = htons(3054);
addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 ");

sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr));

close...続きを読む

Aベストアンサー

ただの文字定数の8進表記と16進表記です。
http://msdn.microsoft.com/ja-jp/library/edsza5ck.aspx

Qメールが全部文字化け!どうすれば修復できますか?

outlookexpress6を使用しています。

ある日突然受信トレイにあるメール内容がすべて文字化けされてしまいました。
どうしたらいいのでしょう・・

元にもどるのでしょうか。。。

エンコード設定でunicode utf8にしたら、自分のメールから自分のメールに送ったらうまくおくれたのですが、外部からおくられてくるメールはいまだに文字化けのままです。。。
受信トレイにたまったメールもすべて文字化けのままなので修復したいです。

お詳しい方どうぞアドバイスよろしくお願いします!

Aベストアンサー

次の操作を試してみてください。

1.[ツール]→[オプション]を実行
2.[読み取り]タブを選択
  2.1.[エンコード]→“日本語(自動選択)”
  2.2.[既定に設定]をクリック ← これ重要!
  2.3.[OK]をクリック

Qプログラムが~~~!!

こんにちは。今、プログラム書いてるんですけど目的としては、
1、テキストファイルから文字列を読み込む。(大体数万文字)
2、それを100個ずつに区切る。
3、その百個ずつを二文字ずつ読んでいって、それがgcという文字列ならばその
百個の中での割合を示す。
4、さらに次の百個を・・・・
みたいなプログラムを書いてるんですけど一応下のような形までこぎつけましたが
もう、お手上げです。
どなたか、助けてください。

#include<iostream.h>
#include<stdio.h>
#include<string.h>
int main()
{
char pch[3];
int count=0;
FILE *fin;


fin=fopen('C:\ahowaki.dat','r');
fscanf(fin,'%s',&pch);

cout<<"入力\n";


while(pch){
cin.read(pch,2);

if((strcmp(pch,"gc"))==0)
count++;


if(count>=0 && count<=25)
cout<<"Under25%\n";
if(count>=26&& count<=50)
cout<<"Under50\n";
if(count>=51&& count<=75)
cout<<"Under75%\n";
if(count>=76&& count<=100)
cout<<"Under99%\n";

else
cout<<"Over100%\n";
}


return 0;


fclose(fin);
}

こんにちは。今、プログラム書いてるんですけど目的としては、
1、テキストファイルから文字列を読み込む。(大体数万文字)
2、それを100個ずつに区切る。
3、その百個ずつを二文字ずつ読んでいって、それがgcという文字列ならばその
百個の中での割合を示す。
4、さらに次の百個を・・・・
みたいなプログラムを書いてるんですけど一応下のような形までこぎつけましたが
もう、お手上げです。
どなたか、助けてください。

#include<iostream.h>
#include<stdio.h>
#include<string.h>
int ...続きを読む

Aベストアンサー

こんにちは。itohhといいます。

前回の質問はこういうことだったのですね。

ちょっと、確認しますが、
1.C:\ahowaki.datファイルを読み込み、以下の処理を行いたい。
2.100バイトごとに特定の文字列の出現回数を採りたい。

これを前提にサンプルを書きます。
(インデントするために先頭に全角スペースを入れています)

int main()
{
  FILE *fin;
  char pch[101];
  int numread=0;
  int count=0;
  int i=0;

  if( (fin = fopen( "C:\\ahowaki.dat", "r+t" )) != NULL )
  {
    do
    {
      memset( pch, 0x00, sizeof(pch));
      /* 100文字を読み込む */
      numread = fread( pch, sizeof( char ), 100, fin );

      count = fncCheck(pch, "gc");

      printf( "%d:%d\n",i, count );
      i++;
    }
    while(numread==100);

    fclose( fin );
}

  return 0;
}

int fncCheck(char *pch, char *item)
{
  int count=0;
  int i=0;

  /* 文字列の最後まで検索する */
  for( i=0; i<stelen(pch); i++)
  {
    /*一致した場合は、カウントする*/
    if(memcomp(&pch[i], item, 2) == 0)
    {
      count++;
    }
  }

  return count;
}

テストしていないのでコンパイルエラー&バグがあるかもしれません。

こんにちは。itohhといいます。

前回の質問はこういうことだったのですね。

ちょっと、確認しますが、
1.C:\ahowaki.datファイルを読み込み、以下の処理を行いたい。
2.100バイトごとに特定の文字列の出現回数を採りたい。

これを前提にサンプルを書きます。
(インデントするために先頭に全角スペースを入れています)

int main()
{
  FILE *fin;
  char pch[101];
  int numread=0;
  int count=0;
  int i=0;

  if( (fin = fopen( "C:\\ahowaki.dat", "r+t" )) ...続きを読む

Q 文字化けの修復方法

windouws 98 NEC ノートパソコンで
文字化けしてしまい一般的な修復方法の
セーフモードにして再起動するとよく直っていたんですが今回は直りませんでした。
セーフモード中は直って普通に見えるのですが
再起動で立ち上げるとま文字化けしてしまいます
何か良い改善方法をおしえてください。
お願いします。

Aベストアンサー

参考URLをご覧のうえ、対処してください。

参考URL:http://homepage2.nifty.com/winfaq/fontstrouble.html

Q構造体データの出力でデータが化けます

/*
テスト用データは半角英数字で書き、半角スペースで区切ってメモ帳で書きました
 
Elfe 1 1 100 10 10 10 10 10 5 3 0 1
goblin 1 1 100 10 10 10 10 10 5 3 0 1
Slime 1 1 100 10 10 10 10 10 5 3 0 1
Orc 1 1 100 10 10 10 10 10 5 3 0 1

実行して表示させてみたところ大きな数字に化けます。
Elfe 7665736 7665740 7665744 7665748 7665752 7665756 7665760 7665764 7665768 766
5772 7665776 7665780 15012128
7665912 7665916 7665920 7665924 7665928 7665932 7665936 7665940 7665944 766594
8 7665952 7665956 15012128

なにがいけないのでしょうか?
よろしくお願いします。
*/

#include <stdio.h>
#include <stdlib.h>
#define MAX 10

typedef struct{// 構造体の宣言
char name[128];//プレイヤーキャラの名前 1
int loading;//ダンジョン階 2
int lv;//レベル 3
int exp;//経験値 4
int hp;//ヒットポイント 5
int mp;//マジックポイント 6
int atk;//攻撃力 7
int def;//防御力 8
int agi;//敏捷力 9
int heal;//回復量 10
int dmg;//ダメージ 11
int y;//Y座標 12
int x;//X座標 13
}player;

int main(void)
{
int i, cnt;
FILE *fp;
player pc[MAX]; // 構造体配列の宣言

if( (fp = fopen( "player.txt", "r" )) == NULL ) {
printf( "ファイルがオープンできません\n" );
exit( 1 );
}
for( i = 0; i < MAX; ++i ) {
if( fscanf( fp, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" // 構造体配列への読み込み
,pc[i].name, &pc[i].loading, &pc[i].lv, &pc[i].exp, &pc[i].hp, &pc[i].mp, &pc[i].atk, &pc[i].def, &pc[i].agi, &pc[i].heal, &pc[i].dmg, &pc[i].y, &pc[i].x ) != 4) break;
}
fclose( fp );

cnt = 0; // これでテスト
printf( "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n"
,pc[cnt].name, &pc[cnt].loading, &pc[cnt].lv, &pc[cnt].exp, &pc[cnt].hp, &pc[cnt].mp, &pc[cnt].atk, &pc[cnt].def, &pc[cnt].agi, &pc[cnt].heal, &pc[cnt].dmg, &pc[cnt].y, &pc[cnt].x);
cnt = 1;
printf( "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n"
,pc[cnt].name, &pc[cnt].loading, &pc[cnt].lv, &pc[cnt].exp, &pc[cnt].hp, &pc[cnt].mp, &pc[cnt].atk, &pc[cnt].def, &pc[cnt].agi, &pc[cnt].heal, &pc[cnt].dmg, &pc[cnt].y, &pc[cnt].x);
return 0;
}

/*
テスト用データは半角英数字で書き、半角スペースで区切ってメモ帳で書きました
 
Elfe 1 1 100 10 10 10 10 10 5 3 0 1
goblin 1 1 100 10 10 10 10 10 5 3 0 1
Slime 1 1 100 10 10 10 10 10 5 3 0 1
Orc 1 1 100 10 10 10 10 10 5 3 0 1

実行して表示させてみたところ大きな数字に化けます。
Elfe 7665736 7665740 7665744 7665748 7665752 7665756 7665760 7665764 7665768 766
5772 7665776 7665780 15012128
7665912 7665916 7665920 7665924 7665928 7665932 7665936 7665940 7665944 766594
8 76...続きを読む

Aベストアンサー

printfの"%d"と、それに対応する引数をよく考えてください。

質問に書かれてるのは以下のような事です。
int i = 0;
printf("%d", &i);

Q文字化けしたワードファイルの修復方法を教えてください

word2003で作成し、保存していた文書を、同じパソコンのword2003で開いたら文字化けしていました。
以前見たときは正常に表示されていて、その後何か操作をした覚えもありません。
文字化けした部分は□が並んだようになっています。

教えてgooの過去の質問や、他のサイトをみて解決方法を調べ、フォントを変える、htmlファイルやrtfファイルで保存しなおす、ワードパッとにコピーする、等色々試して見ましたが直りません。

大切な文書でしたので、修復方法をお教えください。
お願いします。

Aベストアンサー

☐の部分は、文字(文字コード)であったことは確実ですか。
例えば1例でも、(元は)どんな内容か思い出せますか。
正しく表示されていたころは、質問者はそれを見た事を覚えていますか。
ところどころ、少ない部分だけですか。
その後何か特別なことをした、ことは思い出せませんか。
ーー
「文字化け」というのは文字コード(体系)の問題だと思います。間接的にFontなどと関連しますが直接的ではないと思う。
もがいている方向性が疑問に思ったもので。
http://www.asahi-net.or.jp/~ax2s-kmtn/character.html
本質問の解決に直接役に立たないと思うが、参考までに見て置いてください。
何か思い当たる点は無いですか。
上記WEBにもある、機種依存文字など関係ないですか。
文書やファイル作成時に使われた文字コード体系がファイルに記録されるとはっきりするが、そういうOSの仕組みではないようなので難しい。

Qソケットディスクリプタを別プロセスで使いたい

プロセスAで作成したディスクリプタをプロセスBで使いたいのですが
別プロセスへディスクリプタを関連付けたりって出来るのでしょうか?
Aで作成->Bで使えるようにする->Aをクローズ->Bで使う このようにしたいです。

Aベストアンサー

fopk() や exec() で渡すというのではなくて、ということですよね?出来るか出来ないかは完全に OS 依存です。

例えば Linux だと、ソケットに限らず任意のファイル記述子を、あるプロセスから別なプロセスに Unix ソケット経由で渡すことができます。ちょっとトリッキーというか、すこしプログラムが面倒ですが。

参考 URL のページ中程、「例をあげると、 Linux はこの補助データのメカニズムを、 Unix ソケット上での拡張エラーや IP オプション、 ファイル・ディスクリプタの受け渡しに利用している」とあります。私は実際に使っています。

もちろん、同じホスト内でのプロセス間での話で、Inet のソケットではできません。

参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man2/recv.2.html

Q文字化けしたフランス語のメールを修復するには?

フランス語のメールが文字化けしてしまい、
うまく読めなくなってしまいました。

すでに難しい漢字などが紛れてしまった文章を
修復できるようなフリーソフトなどはございませんか?
またはPCの簡単な設定で修復する方法がありますか?
こちら、windows vistaです。
初心者でもわかりやすいものがあれば教えてください。

よろしくお願いいたします。

Aベストアンサー

duosonic です。お疲れ様でした。
ユードラって亜流です、ハッキリ言って。もともとマック用にデザインされた?らしいので、Windowsとは相性悪いのもうなづけます。そもそもライブドアホリエモンが関わっているというだけで、僕の中ではボツです (^^;)

Vistaには Windows Mailが入っていますよね。それで再生できませんかね?

>>あいさつ程度のフランス語しかできませんので、差出人のフランス人にもう一度送って~なんていうことを言えるかどうか・・・(;_;)
>あそうなんですか。何と申し上げて良いのやら 、、、(-_-;)

通じるか否か分からないフランス語で書くよりも、英語で出しちゃうのは手ですよ。欧州人は大抵英語大丈夫ですから。(僕の回答歴?ご覧頂くとお分かりかと思いますが、)英語ならいくらでもお教えいたしますので、ご安心下さい。或いは、フランス語を書けるだけ書いて、外国語?カテで内容が大丈夫か聞いてくるのも手です。


ご参考までに。

Qwindowsプログラム、文字化けする

windowsプログラム、文字化けする
最近になってwindowsプログラムに興味を持ってやってみようと思い
サイトでいざ勉強しようと思ったんですが、サンプルコードをVC++2008で
コンパイル実行してみると、すべて文字化けしています。なぜでしょう
ちなみにOSはXP、サンプルコードてのが

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Hello World!", "メッセージ", MB_OK);

return 0;
}

メッセージボックスでの文字表示のサンプルみたいですがどうもうまくいきません
もう1つ
このサンプルをソースファイルの拡張子cppでやるとエラーがでるんですがcだと警告が出るだけなんですが
これはいったいなんででしょうか。
すみません、最近こういう勉強を始めたばかりなので。

Aベストアンサー

>MessageBox(NULL, "Hello World!", "メッセージ", MB_OK);

ソリューションとかプロジェクトを作成していると思いますが…
文字セットがUNICODEに設定されているのにMBCSの文字列を設定しているので
cppでエラーになっていたのではないですか?
エラーメッセージを掲示された方がよいかと思いますが…

プロジェクトの設定をMBCSに設定するか、UNICODEでの正しい書き方をするか…のどちらかになります。
ネットや書籍など少し古い情報を参照する場合、MBCSに設定した方がそのままコピペでも扱えます。
# ただしプロジェクトを作るたびに設定変更が必要です。
UNICODEでの書き方に変更する場合は、ネットや書籍などの情報は読み替える必要があります。
# MBCS前提で解説されているところは結果が異なる場合があります。

・MBCSに設定を変える方法
[プロジェクト]-[プロパティ]で「プロパティページ」が表示されるのので、
「構成プロパティ」を選択、右側の「文字セット」を「マルチ バイト文字セットを使用する」に変更して[OK]で閉じてからリビルド。

・UNICODEの書き方に変更する
とりあえず、「"~"」になっているところを「_T("~")」に書き換える。
正確な書き方についてはヘルプなどに記載されていますのでそちらを参照してください。

>MessageBox(NULL, "Hello World!", "メッセージ", MB_OK);

ソリューションとかプロジェクトを作成していると思いますが…
文字セットがUNICODEに設定されているのにMBCSの文字列を設定しているので
cppでエラーになっていたのではないですか?
エラーメッセージを掲示された方がよいかと思いますが…

プロジェクトの設定をMBCSに設定するか、UNICODEでの正しい書き方をするか…のどちらかになります。
ネットや書籍など少し古い情報を参照する場合、MBCSに設定した方がそのままコピペでも扱えます。
# ただしプロ...続きを読む


人気Q&Aランキング