どうしても表示できない文字がある
どうしても表示できない文字がある
drawformatstringを使って文章を描画しているのですが、
例えば「魔法使い」と書くと、「魔・」と表示されます。
デバッガで止めて確認して言ったところ「魔法使い」をいれたcharで「文字列中に無効な文字があります」と赤文字で警告されていました。
つまり「法」が無効な文字なのでしょうが、一体表示させるにはどうしたらいいのでしょうか。
フォントは特に変えていません。
この無効な文字はある特定の文字限定で起こるようです。
例えば「魔法使い」と書くと、「魔・」と表示されます。
デバッガで止めて確認して言ったところ「魔法使い」をいれたcharで「文字列中に無効な文字があります」と赤文字で警告されていました。
つまり「法」が無効な文字なのでしょうが、一体表示させるにはどうしたらいいのでしょうか。
フォントは特に変えていません。
この無効な文字はある特定の文字限定で起こるようです。
Re: どうしても表示できない文字がある
再現できるコードを書いてもらえますか。
Re: どうしても表示できない文字がある
すみません。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: どうしても表示できない文字がある
SJIS に於いて "法" は、0x9640 の2バイトで構成されます。
改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。
改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。
改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。
改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。
Re: どうしても表示できない文字がある
2バイト文字の1バイト目あるいは2バイト目に
¥n
と同じ文字コードを含んでいる(表、とか)と、
不幸せなままかもしれません。
¥n
と同じ文字コードを含んでいる(表、とか)と、
不幸せなままかもしれません。
Re: どうしても表示できない文字がある
エスケープシーケンスの事をおっしゃっているのでしょうか。初級者 さんが書きました:2バイト文字の1バイト目あるいは2バイト目に
¥n
と同じ文字コードを含んでいる(表、とか)と、
不幸せなままかもしれません。
"表" に含まれるのは、'¥¥' であって、'¥n' ではありませんよ。
'¥n' のコードは 0x0A です。 これは、SJIS において、1バイト目にも2バイト目にも含まれません。
Re: どうしても表示できない文字がある
/ (スラッシュ)を使用してもいいかもしれません。へろりずむ さんが書きました:SJIS に於いて "法" は、0x9640 の2バイトで構成されます。
改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。
改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。
漢字コードについてによると、Shift_JISの2バイト目は0x40~なので、
0x2Fである/は被らず、また入力も1文字ですみます。
他には、#,$,%なども使えます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: どうしても表示できない文字がある
初級者さん、丁寧な言葉づかいをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: どうしても表示できない文字がある
わざわざ表示できる文字を潰して採用するメリットを教えて欲しいです。
Re: どうしても表示できない文字がある
おー、なるほど!へろりずむ さんが書きました:SJIS に於いて "法" は、0x9640 の2バイトで構成されます。
改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。
改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。
全く思いもよりませんでした。
\nで代用しました。
ちなみにこれは、drawformatstringそれ自体で\nを入れて改行しても描画してくれないので、ISLe さんが書きました:わざわざ表示できる文字を潰して採用するメリットを教えて欲しいです。
一から改行作業をするに当たり、1文字で普段使わなそうで問題も起きなさそうな(実際は起きてしまいましたが)文字の中から何と無しに@を選んだのです。
今にして思えばこれに加えてそもそも文字を潰さないために2文字採用することが頭から抜けてましたね。
Re: どうしても表示できない文字がある
2文字採用ってどういうことでしょう。namari さんが書きました:今にして思えばこれに加えてそもそも文字を潰さないために2文字採用することが頭から抜けてましたね。
'\n'は1文字(シフトJISで1バイト)ですけど別の話でしょうか。
DrawFormatStringが改行してくれないから自前で分割するというのは分かります。
その際に元の文字列の改行コードを別の表示できる文字に置き換えるメリットが分からないのです。