ページ 11

NULL文字のはずなのに描画時に・になる

Posted: 2012年8月20日(月) 16:08
by てんむすキツネ
文章を読み込んで、一定までのカウントが増えたら
描画する文字数を増やし
実際に描画する、という処理をしています。

文字列の終了すべき点numを\0にして
そこまでを描画させています。

が、この\0の部分が・で描画されます。

コード:

void cls_message::Draw_Message(){
	
	DrawRotaGraph( MESSAGE_X , MESSAGE_Y , 1.0f , 0.0f , load.G_blow , TRUE );			//吹き出し

	char buf[ 256 ];

	for( int i=0; i<MESSAGE_NUM_MAX; i++){

		strcpy_s(buf, 256, text[i]);	//文章を読み込む

		if( i == num_line ){			//今表示中の行なら
			buf[num] = '\0';			//表示可能な文字でストップ
		}
		
		if( i <= num_line ){			//まだ表示中でない行は表示しない
			DrawFormatStringToHandle( MESSAGE_X-230 , MESSAGE_Y-80+i*40 , color[0] , font[0] , buf );
		}
	}
}
void cls_message::Message_count(){

	C_message++;

	if( num_line <= MESSAGE_NUM_MAX ){					//存在する行なら
		if( C_message == MESSAGE_ONE_TIME){	//一文字分時間が過ぎると

			num++;										//文字追加
			C_message	= 0;							//カウンタ初期化

			if(text[num_line][num] == '\0'){			//この文が行の終わりなら
				num_line++;								//行追加
				num = 0;								//文字数初期化
				if(text[num_line][0] == '\0'){			//次の行の文がなければ
					num_line = MESSAGE_NUM_MAX+1;		//無理やり終わらせる
				}
			}

		}
	}
	else{
		if( C_message > 60){
			num_line	= 0;
			num			= 0;
			C_message	= 0;
			main_state	= 50;
		}
	}
}
どのような原因が考えられますか?

Re: NULL文字のはずなのに描画時に・になる

Posted: 2012年8月20日(月) 16:18
by softya(ソフト屋)
マルチバイト文字コードの途中でナル文字になった時。
例えばshift-jisの2バイトコードで2バイト目。

Re: NULL文字のはずなのに描画時に・になる

Posted: 2012年8月20日(月) 16:27
by てんむすキツネ
実際に、中身がどうなっているか見てみたら
ソフト屋さんの言っていた意味がよくわかりました。

Re: NULL文字のはずなのに描画時に・になる

Posted: 2012年8月20日(月) 17:02
by てんむすキツネ
質問したいことができたので
解決を外しました

マルチバイト文字コードの場合、どのようにすれば
文字列をくぎることができるでしょうか?

Re: NULL文字のはずなのに描画時に・になる

Posted: 2012年8月20日(月) 17:24
by softya(ソフト屋)
ここの掲示板でも何度か質問が出てますが文字コードを判定して2バイト目かどうかを判定する必要があります。
文章の場合には句読点などの禁則処理も必要でしょうね。

ISLeさんがサンプルを公開しているので探してみてください。
「DXライブラリでの自動改行 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?t=11013&p=88626

Re: NULL文字のはずなのに描画時に・になる

Posted: 2012年8月20日(月) 17:37
by てんむすキツネ
ありがとうございます。
まだ、マルチバイト文字について、あまり理解できていません。

禁則処理というのは、つまり自動で改行した際に
句読点等が文の先頭にこないようにするという処理でしょうか?

Re: NULL文字のはずなのに描画時に・になる

Posted: 2012年8月20日(月) 17:43
by softya(ソフト屋)
天紆 狐 さんが書きました:ありがとうございます。
まだ、マルチバイト文字について、あまり理解できていません。

禁則処理というのは、つまり自動で改行した際に
句読点等が文の先頭にこないようにするという処理でしょうか?
マルチバイト文字だと俗に言う半角文字は1バイトですが全角文字は2バイトになります。
この場合2バイト目に強引にナル文字などを入れると文字コードとして成立しなくるので・などが表示されるわけです。

禁則処理は、そういう事です。元々は印刷・出版業界用語です。
http://ja.wikipedia.org/wiki/%E7%A6%81% ... 6%E7%90%86

Re: NULL文字のはずなのに描画時に・になる

Posted: 2012年8月20日(月) 19:58
by てんむすキツネ
できました!大変有難う御座います!