C言語関係掲示板

過去ログ

No724 文字列から蠅箸いκ源が取り除けない。

※機種依存文字の(株)を使っています。環境によっては文字化けします。

[戻る] [ホームページ]
No.8848

文字列から蠅箸いκ源が取り除けない。
投稿者---九十九(2003/08/06 19:15:15)


文字列から「蝓廚箸い字を取り除きたいのですが、
上手く取り除いてくれません。
「蝓廾奮阿諒源で行うと上手く行きます。
どうしてなのでようか。

環境
HP-UX11.00
コンパイラ
cc
cc -O -Aa -D_HPUX_SOURCE +ESsfc +ESlit


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cut_str(char *) ;

main()
{
    cut_str("金属鉄鋼-ABCDE") ;
}

int cut_str(char *in_data)
{

    char w_str[1024] ;
    char c ;
    int  i = 0 ;

    memset(w_str,'\0',sizeof(w_str)) ;

    printf("in_data,strlen(in_data): [%d] [%s]\n",strlen(in_data),in_data) ;
    while (*in_data) {
        c = *in_data ;
        if ((c & 0xFF) >= 0x81 && (c & 0xFF) <= 0x9F || (c & 0xFF) >= 0xE0 && (c & 0xFF) <= 0xFC) {
            if (memcmp(in_data,"",2) == 0) {
printf("hit\n") ;
                in_data += 2 ;
            } else {
                w_str[i] = *in_data++ ;
                w_str[++i] = *in_data++ ;
                i++ ;
            }
        }
        else {
            w_str[i] = *in_data++ ;
            i++ ;
        }
    }
    printf("w_str: [%d] [%s]\n",strlen(w_str),w_str) ;
}



No.8852

Re:文字列から蠅箸いκ源が取り除けない。
投稿者---あかま(2003/08/06 21:18:03)


mencmpじゃなくてstrstrを使ったほうがわかりやすいんじゃないかと個人的に思う。

あと↓これの意味がわからないので、プログラムが読めない…
((c & 0xFF) >= 0x81 && (c & 0xFF) <= 0x9F || (c & 0xFF) >= 0xE0 && (c & 0xFF) <= 0xFC)


取り除くだけならこんなのでどうでしょう。
#include <stdio.h>
#include <string.h>

/*void cut_str(元の文字列ポインタ,取り除く文字列ポインタ)*/
void cut_str(char  *s_str,char *c_str){
	char *strp,*strp2;
	while((strp = strstr(s_str,c_str)) != NULL){
		for(strp2 = strp+strlen(c_str);*strp2;strp++,strp2++)
			*strp = *strp2;
		*strp = '\0';
	}
	
}


int main()
{
	char str[]="金属鉄鋼-ABCD\0E";
	cut_str(str,"") ;
	printf("%s\n",str);

}


No.8855

蠅箸い發犬、0xFA,0x58」であった。
投稿者---九十九(2003/08/06 22:07:30)


蠅箸いκ源を16進でみたのですが、
「0xFA,0x58」となっていました。

キーボードから蠅汎力すると「0x87、0x8A」
となっており、
strcmpや、memcmpをしても同じ文字と認識されなかった。

この体系の蠅箸覆匹里茲Δ癖源なのですか。
両方の蠅鯣獣任垢襪砲蓮16進で見たほうがよいのでしょうか。




No.8857

Re:蠅箸い發犬、0xFA,0x58」であった。
投稿者---ともじ(2003/08/06 22:48:17)


こんばんは。

>蠅箸いκ源を16進でみたのですが、
>「0xFA,0x58」となっていました。
>
>キーボードから蠅汎力すると「0x87、0x8A」
>となっており、
>strcmpや、memcmpをしても同じ文字と認識されなかった。
>
>この体系の蠅箸覆匹里茲Δ癖源なのですか。
>両方の蠅鯣獣任垢襪砲蓮16進で見たほうがよいのでしょうか。

私も詳しいわけではないのですが、調べてみると「蝓廚箸いκ源は
シフトJISでは、0xFA58 と 0x878A の両方に符号化されているようです。
ですから、やはりコードで比較した方がよいと思います。

ちなみに、WindowsXP BCC5.5 及び cygwin で最初の九十九さんの書いた
プログラムを実行しましたが、きちんと「蝓廚郎鐔できました。

>あと↓これの意味がわからないので、プログラムが読めない…
>((c & 0xFF) >= 0x81 && (c & 0xFF) <= 0x9F || (c & 0xFF) >= 0xE0 && (c & 0xFF) <= 0xFC)

これは、シフトJISでの全角コードの1バイト目の範囲です。全角コード
なら、「蝓廚鯆瓦戮討い襪錣韻任后


No.8858

Re:蠅箸い發犬、0xFA,0x58」であった。
投稿者---あかま(2003/08/06 23:57:23)


なるほど。文字コードが2つあるんですね。
キーボードから入力するときは環境によって取る値が違うんでしょうか。

プログラムと入力でコードが違うのなら、プログラムの方のコードに変換してしまってはどうでしょう?
そのあとに文字列削除の関数と。二度手間ですが。
void change_kabu(char *s_str){
	char *strp=s_str;
	char kabu[]="";
	char f_kabu[3];
	if(kabu[0] == 0xFA && kabu[1] == 0x58){
		f_kabu[0] = 0x87;
		f_kabu[1] = 0x8A;
	}
	else{
		f_kabu[0] = 0xFA;
		f_kabu[1] = 0x58;
	}
	f_kabu[3] = '\0';
	while(strp = strstr(strp,f_kabu)){
		strp[0] = kabu[0];
		strp[1] = kabu[1];
	}
}


No.8859

Re:(株)といもじが、0xFA,0x58」であった。
投稿者---YuO(2003/08/07 00:05:31)


>(株)という文字を16進でみたのですが、
>「0xFA,0x58」となっていました。
>キーボードから(株)と入力すると「0x87、0x8A」
>となっており、
>strcmpや、memcmpをしても同じ文字と認識されなかった。

歴史的な経緯で,13区に相当する部分にあるのが「NEC特殊文字」,
115区に相当する部分にあるのが「IBM拡張文字」です。
NEC特殊文字はPC-9801,IBM拡張文字はIBM機(詳細不明)との互換の為の文字です。

ちなみに,どちらの文字も私企業の名前が冠してあるとおり,JIS X 0208に含まれない文字です。
Unicode(またはISO-10646-1)由来の文字コードを使っている場合を除いて,
ネット上では利用すべきではありません。
#なので,http://www.unicode.org/charts/PDF/U3200.pdfに従って展開しています。


>この体系の(株)となどのような文字なのですか。
>両方の(株)を判断するには、16進で見たほうがよいのでしょうか。

文字集合としてWindows-31jを利用する以上は別個の文字として扱うしかありません。
文字集合としてUnicodeやISO-10646-1を利用するのであれば,
(株)は\u3231しか存在しないので問題なく利用できます。


No.8860

Re:文字列から蠅箸いκ源が取り除けない。
投稿者---九十九(2003/08/07 00:47:06)


>あと↓これの意味がわからないので、プログラムが読めない…
>((c & 0xFF) >= 0x81 && (c & 0xFF) <= 0x9F || (c & 0xFF) >= 0xE0 && (c & 0xFF) <= 0xFC)
>
漢字コードのチェックと変換で、↓を参考にしました。
http://www.softinn.jp/pc/Cfree/classlib/doc/jcode/jcodeSum.htm

No.8861

Re:文字列から蠅箸いκ源が取り除けない。
投稿者---九十九(2003/08/07 00:48:11)


>>あと↓これの意味がわからないので、プログラムが読めない…
>((c & 0xFF) >= 0x81 && (c & 0xFF) <= 0x9F || (c & 0xFF) >= 0xE0 && (c & 0xFF) <= 0xFC)
>
漢字コードのチェックと変換で、↓を参考にしました。
http://www.softinn.jp/pc/Cfree/classlib/doc/jcode/jcodeSum.htm

No.8865

Re:文字列から蠅箸いκ源が取り除けない。
投稿者---かずま(2003/08/07 10:32:02)


> mencmpじゃなくてstrstrを使ったほうがわかりやすいんじゃないかと個人的に思う。

単純に memcmp や strstr を使うと、「蝓廚 87 8A だった場合、
「合格」という文字列が 8D 87 8A 69 なので、これは 8D 69 の「絞」に
なってしまいます。

No.8871

Re:文字列から蠅箸いκ源が取り除けない。
投稿者---九十九(2003/08/07 21:56:16)


>単純に memcmp や strstr を使うと、「蝓廚 87 8A だった場合、
>「合格」という文字列が 8D 87 8A 69 なので、これは 8D 69 の「絞」に
>なってしまいます。

ちょっと分からなかったのですが、
要するに、2バイトの文字のほかに、文字列でみたとき、
前の文字の2バイト目と次の文字の1バイト名で、「87 8A 」となる
ことがあるということですか。
チェックの仕方を注意しなければいけないということでか。