プロが教えるわが家の防犯対策術!

固定長のテキストに区切り文字の","や"/"を挿入して整形する
プログラムを作っていたときWin98では正常に動作していましたが、
Win2000だと文字化けしてうまくいきません。
Unicodeとの文字コードの違いかな?とも思ったのですが、16bit
(2バイト)ということでバイト数は同じだと思うのですが、デバッカ
で見ると目的の位置より手前でカウントを終了しているようです。
というのもWin2000上ではデバッカのローカル変数をウオッチしても
変数内の漢字も文字化けしているため確認できません。

元のテキスト
"20010505文字列次の文字列1234"
こうしたい
"2001/05/05,文字列,次の文字列,12,34"
が、こうなる
"2001/05/05,文字・。・・次の文字・。、" (実際とは違います)


行儀が悪いプログラムなのですが、こんな感じです。
char kigou[7][2]={"/","/",","," ",":",":",""};
int skip[7]={4,2,22,12,2,2,2};

for(i=0;i<7;i++){
strncat(tmpbuff, pt, skip[i]);
tmpptr += skip[i];
strcat(tmpbuff,kigou[i]);
tmpptr += strlen(kigou[i]);
pt += skip[i];
}
コンパイラはBorlandC++Builder4です。
ファイルの整形だけなのでCの関数しか使っていません。
ご存知の方、回答よろしくお願いします。

A 回答 (2件)

こんにちは。


的を得ていなくてすみません。
入力データを把握する意味で、入力データを全て16進で表示させてみては如何ですか?

for(i = 0; i < 1024; i++)
printf(" %02x", *(pt+i) & 0xff);

Win環境でプログラムを作ったことが最近ないので、一緒に悩んでしまってごめんなさい。 (^^;

この回答への補足

ははぁ、なるほど。
ファイルから読み込んだダンプリストとストリームから読み込んだデータのダンプを比べてみれば違いがわかりそうですね。
私もCプログラムが久しぶりなので思いつきませんでした。ちょっとやってみます。でも、違いがわかってもUnicodeだった場合の変換といおうか文字列の扱いはどうしたらいいんでしょうか・・。

補足日時:2001/08/28 14:36
    • good
    • 0
この回答へのお礼

pikacchuさん。ありがとうございます。
ダンプ出力して調べてみた結果、UnicodeではなくJISでした。(ホストマシンが古いので)少し容量が増えていたのも、漢字の開始、終了に伴う0x1b,0x24,0x40などのコードでした。JISコードは他の文字と領域が重なるため漢字の開始、終了に専用のコードが挿入されるのをすっかり忘れていました。何はともあれダンプのアイデアで解決できました。でもWin98環境ではどうして動いていたんだろう・・・?

お礼日時:2001/08/30 15:46

こんにちは。


初歩的なことでもうしわけないですが、"tmpbuff"は'\0'(ヌル)で初期化されていますか?
ローカル変数と仮定すると起こりえるかと・・・

この回答への補足

省略したソースなのでご心配をおかけしました。
作業用の配列はすべてmemsetで初期化しております。
memset(tmpbuff,'\0',1024);
fgets()で読み込んでいるのですが、どうも漢字の部分が容量が増えている気配があります。(正確には数えていませんが・・)
Unicodeではストリームで読み込んだデータに何か付加する仕様になっているのでしょうか?半角数字は変化がないようです。

以上、よろしくお願いします。

補足日時:2001/08/28 13:36
    • good
    • 0

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