ページ 11

どうしても表示できない文字がある

Posted: 2014年2月24日(月) 23:22
by namari
drawformatstringを使って文章を描画しているのですが、
例えば「魔法使い」と書くと、「魔・」と表示されます。
デバッガで止めて確認して言ったところ「魔法使い」をいれたcharで「文字列中に無効な文字があります」と赤文字で警告されていました。
つまり「法」が無効な文字なのでしょうが、一体表示させるにはどうしたらいいのでしょうか。
フォントは特に変えていません。
この無効な文字はある特定の文字限定で起こるようです。

Re: どうしても表示できない文字がある

Posted: 2014年2月24日(月) 23:29
by h2so5
再現できるコードを書いてもらえますか。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 00:31
by namari
h2so5 さんが書きました:再現できるコードを書いてもらえますか。
すみません。

コード:

message_add(0,ch.name,"魔法攻撃!@",enemykind[enemy[j].kind].name,"は",dam_char[i],"のダメージを受けた");//@は改行の印。


void message_add(int icon,char id[],char message1[],char argument1[],char message2[],char argument2[],char message3[]){//アイコンの画像番号、名前、メッセージ1,受け取る引数、メッセージ2・・・
	char *tp;
	int i=0,j;
	char message[255];
	if(message_only_one_and_turn_end_flag==1){message_only_one_and_turn_end_flag=0;message_cnt=0;message_graph_cnt=1;last_message_clear_cnt=0;}
    message_cnt++;
    pre_icon[message_cnt]=icon;
	strncpy(pre_id[message_cnt],id,255);
	for(j=0;j<3;j++){sprintf(pre_message[j][message_cnt],"");}
    sprintf(message,"%s%s%s%s%s",message1,argument1,message2,argument2,message3);
/*デバッガで順々にステップアウトしていくとここのsprintfを終えたところでmessage内がおかしくなっている*/
	tp = strtok( message, "@" );
	strncpy(pre_message[0][message_cnt],tp,255);
    while ( tp != NULL ) {
		i++;
        tp = strtok( NULL,"@" );
        if ( tp != NULL ) strncpy(pre_message[i][message_cnt],tp,255);
    }
}
この後、文字描画に続くんですが、おそらくこの問題があるのはこの中だと思われます・・・。
sprintfの後が最も怪しいんですけどわかりません。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 07:02
by へろりくしょん
SJIS に於いて "法" は、0x9640 の2バイトで構成されます。

改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。

改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 08:23
by 初級者
2バイト文字の1バイト目あるいは2バイト目に
¥n
と同じ文字コードを含んでいる(表、とか)と、
不幸せなままかもしれません。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 08:38
by へろりくしょん
初級者 さんが書きました:2バイト文字の1バイト目あるいは2バイト目に
¥n
と同じ文字コードを含んでいる(表、とか)と、
不幸せなままかもしれません。
エスケープシーケンスの事をおっしゃっているのでしょうか。
"表" に含まれるのは、'¥¥' であって、'¥n' ではありませんよ。

'¥n' のコードは 0x0A です。 これは、SJIS において、1バイト目にも2バイト目にも含まれません。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 09:09
by みけCAT
へろりずむ さんが書きました:SJIS に於いて "法" は、0x9640 の2バイトで構成されます。

改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。

改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。
/ (スラッシュ)を使用してもいいかもしれません。
漢字コードについてによると、Shift_JISの2バイト目は0x40~なので、
0x2Fである/は被らず、また入力も1文字ですみます。
他には、#,$,%なども使えます。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 13:20
by 初級者
お〜、間違い間違い。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 13:31
by softya(ソフト屋)
初級者さん、丁寧な言葉づかいをお願いします。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 16:10
by 初級者
これは大変失礼をいたしました。
以後、じゅうぶんに気をつける所存にございます。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 17:49
by ISLe
わざわざ表示できる文字を潰して採用するメリットを教えて欲しいです。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 19:09
by namari
へろりずむ さんが書きました:SJIS に於いて "法" は、0x9640 の2バイトで構成されます。

改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。

改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。
おー、なるほど!
全く思いもよりませんでした。
\nで代用しました。
ISLe さんが書きました:わざわざ表示できる文字を潰して採用するメリットを教えて欲しいです。
ちなみにこれは、drawformatstringそれ自体で\nを入れて改行しても描画してくれないので、
一から改行作業をするに当たり、1文字で普段使わなそうで問題も起きなさそうな(実際は起きてしまいましたが)文字の中から何と無しに@を選んだのです。
今にして思えばこれに加えてそもそも文字を潰さないために2文字採用することが頭から抜けてましたね。

Re: どうしても表示できない文字がある

Posted: 2014年2月25日(火) 22:56
by ISLe
namari さんが書きました:今にして思えばこれに加えてそもそも文字を潰さないために2文字採用することが頭から抜けてましたね。
2文字採用ってどういうことでしょう。
'\n'は1文字(シフトJISで1バイト)ですけど別の話でしょうか。

DrawFormatStringが改行してくれないから自前で分割するというのは分かります。
その際に元の文字列の改行コードを別の表示できる文字に置き換えるメリットが分からないのです。