• ベストアンサー

C++,CGI文字コード変換

簡単な質問ですみませんが宜しくお願いいたします。 現在、C++で不正文字が入力された場合、 不正文字を空白に置き換えてコードを無害化する変換処理を行っています。 《変換文字》 \,;,\n,\t,",' 《変換に使用している関数》 strstr(変換前char,変換後char) 変換前char文字として、 \については、"\\" "については、"\"" 'については、"\'" と置き換えて、マッチングをかけるようにしていますが、 \だけは、どうしても変換処理がうまくいきません。 どうすればよろしいでしょうか? 教えてください。宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.3

わたしがよくやるパターンとして str:=検索対象文字列 const char chrset = "\r\n\t \\\""; // 消したい文字 while(1) { char *p; if(NULL == (p = strpbrk(str, chrset))) break; *p = 0x7f; // DELコード } とか。 うちのライブラリではDELコードを無視するので… まあその辺は適当に。

googoocgi
質問者

お礼

rentahero様 皆様 ご回答くださいましてありがとうございます。 いろいろと試し、 何とか文字変換ができるようになりました。 やはり、今更ですが、ポインタを理解しないことには 何も始まらないことを実感いたしました。 結局、 「\\」については、 その他の文字検索で使用している strstr標準関数ではなく strchrで'\\'で検索するようにしました。 strpbrkを使用してみましたが、 私の能力の足りなさから、 発見した箇所からうまくポインタを回せず 発見した不正コード以降の文字列が 削除されてしまいましたので、 strcpyを使用することにしました。 おかげで、 文字列「><abcde'fghijk\」というように 不正な文字コードが複数含まれていた場合も 「abcdifghijk」 と置換できるようになりました。 strcpyを使用した場合、 セキュリティ面でBOF攻撃などにあうなどの 問題が発生するのではないかとも 言われましたが・・・ 今は調査中です。 とりあえず、 不正文字が複数含まれていた場合も 正常に置換できるようになりました。 皆様の温かなコメントのおかげです。 ありがとうございました。

その他の回答 (2)

回答No.2

ソースがないと分かりません。 自作の変換関数ですか?ライブラリの変換関数ですか? MFCですか?

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

strstrって標準ライブラリの関数だよね。単純に部分文字列を探すだけで文字列の置き換えができるような関数じゃなかったと思うけど。 \や"や'はそれぞれ一つの文字なので'\\'、'\"'、'\''としてstrchrで該当文字を探せば良いのでは? あるいはstrcspnを使えば排除したい文字を同時に探せると思うけど。

googoocgi
質問者

お礼

回答くださいましてどうもありがとうございます。 また、説明不足で大変申し訳ございません。 ご指摘いただいたとおり、 strstrの関数では、文字列探索のみを行っています。 その後、memmove関数を用いて 文字列の変換を行っています。 実際には、 // 文字列探索 while( (hit = strstr("変換したい文字列","\\")) != NULL) // 文字列のシフト処理 // 空白に置き換え memmove(hit, "", (変換後文字列-変換前の発見文字列)) というような具合に処理を書いております。 '\\'で文字列の探索を行っているのですが、 実際に変換されているかどうかを 確認してみると、 hidden項目には、\が入った状態になってしまいます。 (※"や'は、空白に置き換えられて、削除されています) 同じように、\のエスケープ文字を付加して書いているのに \だけうまくいかない理由がよくわかりませんが、 strcspnや、strchrは、まだ試していないので 早速それで行ってみようと思います。 どうもありがとうございました。

関連するQ&A

  • 文字を16進変換

    C言語にて関数などを使わずに計算式なので文字を16進数に変換したいのですがどのような処理にしたらいいでしょうか?? char型で用意した変数に1文字を格納し、それをアスキーコードの16進数に変換したいです。 よろしくお願いします。

  • gccでiconvを使った文字コード変換で文字化け?

    Linuxでgccを使ってプログラムを作っていますが、文字コード変換が一部分うまくいかなくて困ってます。 Shift-JISで作られたテキストファイルから一行ずつ文字を読み込んで、 それをUTF-8に変換して画面に出力しているんですが、 「神石高原町」だけ文字化けしているのか、表示されません。 前後の行は表示されるのでちょうど1行空白になる感じです。 とりあえず変換用に作った関数。 BOOL SJIStoUTF( char* pin, // (IN) 変換元文字列 char* pout, // (OUT) 変換後文字列格納領域 size_t olen) // (IN) 変換後文字列格納領域サイズ { iconv_t cd; size_t ilen, rlen; cd = iconv_open( "UTF-8", "SJIS-WIN" ); ilen = strlen( pin ); rlen = iconv(cd, &pin, &ilen, &pout, &olen ); if( rlen == -1 ){ printf( "ERROR in S2U (%s)\n", pin ); return FALSE; } *pout = '\0'; iconv_close( cd ); return TRUE; } この関数に「神石高原町」を与えて返ってきた文字をファイルに出力して、 秀丸の文字コードUTF-8で開くと変換できなかった文字が「神」の前にあり、文字も「神石高原」になるし・・・。 Linuxのコンソール上でiconvのコマンド使ってファイルごと変換すれば 文字化けしないんですけど、 gccでiconv使うときは気をつけなきゃだめなことがあるんでしょうか? なんでこうなるのかわかる方がいたら教えてください。

  • 「C#」文字コードの取得&文字変換

    C#で文字コードを調べるプログラムを作成しています。 そこで2つ質問をさせてください。 1つ目(文字コード調べ) TextBoxに漢字を入力して,各エンコーディングの文字コードを調べるときに,UNICDEの場合, Encoding enc_default = Encoding.GetEncoding(932); string input = tb_input.Text; byte[] byte_input = enc_default.GetBytes(input); string outtext_unicode = ""; Encoding enc_unicode = Encoding.Unicode; byte[] byte_unicode = Encoding.Convert(enc_default,enc_unicode, byte_input); foreach (byte b in byte_unicode) { outtext_unicode += string.Format("{0:X}", (int)b); } tb_output_unicode.Text = outtext_unicode; とすると,調べたい文字コードがLE(リトルエディアン)で出力されます。これをBE(ビッグエディアン)で出力されるにはどうしたらよいでしょうか? ご存知の方がいらっしゃいましたら,ぜひ教えてください。 よろしくお願いいたします。 2つ目(文字コードから文字を取得する) 上記の質問と逆のパターンで,TextBoxに文字コードを入力してもらい,人間が読める文字に変換する場合下記のようなコードを書くと, string codePoint_string = tb_output_unicode.Text; int codePoint = int.Parse(codePoint_string); char c = (char)codePoint; tb_input.Text = Convert.ToString(c); ASCIIの文字コードを入力した場合には,きちんと変換してくれるのですが,漢字の文字コードを入力すると,FormatExceptionが発生します。 何か勘違いをしているのかもしれませんが,いまいちやり方が創造できません。 こちらも,ご存知の方がいらっしゃいましたら,ご教示願います。

  • C言語:小文字を大文字に変換する関数を作成

    C言語超初心者です。学校の課題で次のような問題が出されました。 ・問題・ 次に挙げる縛りに沿い、以下の関数とメイン関数を作り、処理結果を画面に作成しなさい。 char *tst(char *str) ・strの中の文字列も小文字を大文字に変換し、変換した文字列が格納されているchar *に返す。 ・引数strの中の文字列は受け取った状態で手を加えない。 ・関数内でmalloc関数を使用し、領域を確保して大文字に変換した文字列を格納しreturnでポインタを返す。 ・malloc関数を使用する。 ---------------------------------------------------------------------------------- 大文字に変換するには while(*str != '\0') { if(*str >= 'a' && *str <= 'z') { *str -= 'a'- 'A'; } ++str; } というのは分かったのですがここから何をすするか全く分かりません。初心者なのでなるべく分かりやすく教えてもらえると有難いです。 お願いします。

  • 文字変換について

    PHP+MYSQLで会員制のサイトを作っています。 文字の扱いについて教えてください。 掲示板等で、入力された文字列の処理についてですが、 入力禁止文字や、半角カナ、全角英文字等の定番的な処理方法はあるのでしょうか? (半角カナは全角に変換すべきとか、) この関数を使うといいよ、とかいうのがあると嬉しいです。 なお、文字コードはeuc-jpです。

    • 締切済み
    • PHP
  • VB6.0 特殊文字コードの変換

    いつもお世話になっております。 前回、機種依存文字の変換について質問させて頂いた者です。 &#12849;⇒(株) 等の&#number;型の文字コードの変換はchrw関数を用いる事で 無事に変換することが出来ました。 また新たに文字コードの変換について教えていただきたいのですが、 &amp;⇒& などの&keyword;型の変換をするような関数など無いでしょうか? 関数だけでなく、こうすれば?っていうのもあれば教えて頂けると 幸いです。 以上です。よろしくお願い致します。

  • C言語で16進数の文字コードを文字列に変換

    16進の文字コードを入力してそれに対応する文字列を出力したいのですが 文字列から16進コードに変換出来ても16進コードから文字列に変換することが出来ません。 参考になるコードかサイト、または何かヒントがございましたらよろしくお願い致します。

  • 文字コードの変換

    現在PHPの学習を行っているのですが、文字コードの変換方法が分かりません。 入力した文字列と、保存してあるテキストの中の文字列を比較するプログラムを作ったのですが、 英語は比較できるのですが、日本語は比較できません。 私たちが考えている問題としては、入力した文字がSJISなので、EUCで作ったプログラム内で動作しません。 どうしたら、入力した文字をEUCに変換することができるのか教えていただくことはできないでしょうか?

  • ■ 文字コードの出力について ■

    符号付char型の変数「moji」に文字を代入し、その文字コードの上位4ビットと下位4ビットをそれぞれAND演算でビットを抽出し、算術右4シフトと算術左4シフトで処理して元の上位4ビットと下位4ビットを入れ替えて文字コードを出力するC言語プログラムです。 例えば、「A」の文字コード「41」を「14」で出力します。 問題は「N」です。 「N」の文字コードは「4E」です。これを「E4」に変えて出力したいのですが、「ffffffe4」となってしまいます。 解決策は、符号無しchar型の変数にすることが分かりました。 なぜ、符号無しchar型の変数にしないと正常に表示できないのでしょうか? コンパイラは「Borland C++ Compiler 5.5」です。 お答えできる方、よろしくお願いいたします。

  • 文字コードから文字列への変換

    よくわからないタイトルですみません(汗。 標準入力からデータを渡すと、I/Oをしてくれるというモジュールを書いているのですが、当初、テキストのみの設計のつもりだったのが、バイナリを扱うはめになってしまいました。 それで、バイナリはstdinから読めなさそうだったので、0xXYZという文字列にしてからstdin経由で渡そうと思ったのです。 今回の質問は、その文字列で書かれた16進コードを文字に直す方法なのです。 つまり、char buf[80] = "0x414243"という文字列を渡した場合、char buf2[80] = "ABC" という文字列を得たいのです。(0x41="A") 変な希望ですが、何通りか試したのですが、根っからのテキスト処理大好きPerl人間なので、Cの知識の無さに挫折してしまいました。 アドバイスをよろしくお願いいたします。