No.17703![]() |
単語の編集 投稿者---K.S(2004/11/01 22:56:03) |
||
いつもお世話になります。 検索する単語を編集しています。 単語と単語の中に全角スペースがあった場合は半角スペースに変換する処理は出来ていますが、例えば”データ”を入力すると文字化け”デ璽”になってしまいます。”ー”が問題でしょうか?そこでstrstr条件で分岐していますが、”データ 比較”を入力した場合、全角スペースと”ー”が入っていますので、どういった対処すればよいのでしょうか? : char *p ; const char *rep = " " ; /* 半角スペース */ char buf[128] ; char work[128] ; char work2[128] ; work[0] = '\0' ; if( ! strstr( buf, " " ) == NULL ) { /* 全角スペース→半角スペースに変換 */ for( p = strtok( buf, " " ) ; p ; p = strtok( 0, " " ) ) { strcat( work, p ) ; strcat( work, rep ) ; } work[strlen( work ) - strlen( rep ) ] = '\0' ; strcpy( work2, work ) ; } else { strcpy( work2, buf ) ; } : ご教授宜しくお願い申し上げます。 |
No.17707![]() |
Re:単語の編集 投稿者---かずま(2004/11/02 01:18:22) |
||
> 単語と単語の中に全角スペースがあった場合は半角スペースに変換する処理は > 出来ていますが、例えば”データ”を入力すると文字化け”デ璽”になって > しまいます。 出来ていないじゃないですか。文章は論理的に書いてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> void conv_space(const char *in, char *out) { while (*in) if (memcmp(in, " ", 2) == 0) *out++ = ' ', in += 2; else { int len = mblen(in, MB_CUR_MAX); while (--len >= 0) *out++ = *in++; } *out = 0; } int main(void) { char buf[256]; setlocale(LC_CTYPE, ""); conv_space("データ 比較", buf); puts(buf); return 0; } |
No.17714![]() |
Re:単語の編集 投稿者---K.S(2004/11/02 10:38:12) |
||
ご回答ありがとうございます。 私の力不足ですみません。 conv_space()の中に間違いはないでしょうか? 実行してみたら、何も動かなかったです。 自分でも色々やってみましたら、どうしても出来なかったでした。 もう一度お願いできないでしょうか? >> 単語と単語の中に全角スペースがあった場合は半角スペースに変換する処理は >> 出来ていますが、例えば”データ”を入力すると文字化け”デ璽”になって >> しまいます。 > >出来ていないじゃないですか。文章は論理的に書いてください。 ><pre> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> void conv_space(const char *in, char *out) { while (*in) if (memcmp(in, " ", 2) == 0) *out++ = ' ', in += 2; else { int len = mblen(in, MB_CUR_MAX); while (--len >= 0) *out++ = *in++; } *out = 0; } int main(void) { char buf[256]; setlocale(LC_CTYPE, ""); conv_space("データ 比較", buf); puts(buf); return 0; } </pre> |
No.17715![]() |
Re:単語の編集 投稿者---ねむねこ(2004/11/02 11:06:32) |
||
>conv_space()の中に間違いはないでしょうか? >実行してみたら、何も動かなかったです。 WindowsXP, VC++6.0 SP6 で試してみたところ、 問題無く実行できました。 |
No.17716![]() |
Re:単語の編集 投稿者---K.S(2004/11/02 11:13:53) |
||
>>conv_space()の中に間違いはないでしょうか? >>実行してみたら、何も動かなかったです。 >WindowsXP, VC++6.0 SP6 で試してみたところ、 >問題無く実行できました。 私の方ではunixで使用しています。 ある関数だけが対応していないのでしょうか? まさか、そんなことはないと思うけど・・・・ |
No.17717![]() |
Re:単語の編集 投稿者---あかま(2004/11/02 11:38:31) |
||
>私の方ではunixで使用しています。 >ある関数だけが対応していないのでしょうか? >まさか、そんなことはないと思うけど・・・・ Red Hat Linuxで試したらS-JISで保存しているのをコンパイルしたときは動かないですね。 当然ですが。 nkf -e < 元ファイル名 > 出力ファイル名 で文字コードをEUCにしてみてください。 |
No.17724![]() |
Re:単語の編集 投稿者---K.S(2004/11/02 14:32:48) |
||
>>私の方ではunixで使用しています。 >>ある関数だけが対応していないのでしょうか? >>まさか、そんなことはないと思うけど・・・・ >Red Hat Linuxで試したらS-JISで保存しているのをコンパイルしたときは動かないですね。 >当然ですが。 > >nkf -e < 元ファイル名 > 出力ファイル名 > >で文字コードをEUCにしてみてください。 -eってSJISからEUCに変換するコマンドですよね。 そのソースをtest.cに保存しますと、そのファイルはEUCですので、 そのままですが、、、それでも動かないです。 |
No.17725![]() |
Re:単語の編集 投稿者---あかま(2004/11/02 14:49:55) |
||
>-eってSJISからEUCに変換するコマンドですよね。 入力がなんであれ、EUCに変換しますね。 >そのソースをtest.cに保存しますと、そのファイルはEUCですので、 >そのままですが、、、それでも動かないです。 実験してみましたか? 文字コード扱ってて動かない場合は、やはり文字コードが原因のことが多いです。 EUCで保存したつもりが実は… なんてことがありますのでとりあえずはやってみてください。 それでできなければ、少し詳しい環境が必要かもしれません。 あと、nkfコマンドの入力ファイルと出力ファイルを同名にするとファイルの内容が消えますので注意(少なくとも私の環境では) |
No.17727![]() |
Re:単語の編集 投稿者---かずま(2004/11/02 16:40:10) |
||
> 私の方ではunixで使用しています。 unix だけでは分かりません。 たとえば、Linux の Fedora で環境変数 LANG=ja_JP.UTF-8 だと、 if (memcmp(in, " ", 3) == 0) *out++ = ' ', in += 3;にしないと、正しい結果が出ません。 |
No.17728![]() |
Re:単語の編集 投稿者---K.S(2004/11/02 18:45:09) |
||
>> 私の方ではunixで使用しています。 > >unix だけでは分かりません。 > >たとえば、Linux の Fedora で環境変数 LANG=ja_JP.UTF-8 だと、 > if (memcmp(in, " ", 3) == 0) *out++ = ' ', in += 3;にしないと、正しい結果が出ません。 ソースはSunOSを使用し、モジュールはTurboLinux8でMakeしています。 FedoraってRedHatだけ?Googleで検索してもTurboは見当たらなかったでした。上記のソースを変更しても変わらず、動きませんでした。 あかまさんの言うとおりに、文字コードが原因でしょうか? |