回答済み シングルクオーテーションの検索

  • 2012年4月6日 5:03
     
      コードあり
    シングルクオート(右)(Unicode:U+2019)をIndexOfメソッドを使って検索する方法はないでしょうか?
    アポストロフィー(Unicode:U+0027)ではなくシングルクオートの検索です。
    using System;
    using System.IO;
     
    class Search{
      static void Main(){
        StreamReader sr = new StreamReader("読み込むテキストファイル名");
        string html = sr.ReadToEnd();
        sr.Close();
    
        int position = html.IndexOf("検索するキーワード");
        Console.WriteLine(position);
      }
    }
    上記のコードをコンパイル、実行させた場合、アポストロフィーを含むテキストファイルに対するアポストロフィーを含むキーワードの検索ならhitします(正の整数値が返されます)。
    しかし、シングルクオートを含むテキストファイルに対してシングルクオートを含むキーワードを検索すると、「-1」(エラー)が返されます。

    検索キーワードのシングルクオートの前に「\\(半角円マーク2つ)」を付けてみましたが、やはり「-1」が返されます。

    ●環境
    Microsoft Visual C# 2008 Compiler version 3.5.30729.5420
    コマンドラインコンパイラ
    Windows 7 Professional SP1
    • 編集済み hrkey 2012年4月6日 9:46
    •  

すべての返信

  • 2012年4月6日 5:43
     
      コードあり

    問題なく動作すると思います。

    string str     = new string(new char[] { 'a', 'b', 'c', (char)0x2019, 'd', 'e', 'f' });
    string keyword = new string(new char[] { (char)0x2019 });
    Console.WriteLine(str.IndexOf(keyword));

    StreamReader でのファイル読み出しなど質問とは無関係な部分を省いて、問題が再現するコードを挙げると適切なアドバイスがつくかもしれません。

    ちなみに 0x2019 はいわゆる全角文字のようですがその辺は大丈夫ですか?

  • 2012年4月6日 5:43
     
      コードあり
    "\u2019".IndexOf("\u2019");

    はきちんと0を返してきました。なのでIndexOf()の問題ではないように感じます。hrkeyさんの環境ではどうでしょうか?

    となると実はテキストファイルにU+2019が含まれていないとかそういうことはありませんか?

  • 2012年4月6日 6:43
     
     

    後ろに結合文字などがあるとIndexOf(String)では検索できない場合があったりしますが、その辺とか?

    Char単位で検索したい場合はStringComparison.Ordinalオプションを使用します。

  • 2012年4月6日 9:28
     
     

    ご指導ありがとうございます。

    実は以下のページのHTMLソースから「What’s New(Whatの後ろはU+2019)」の文字位置を探そうとしています。
    https://www.cia.gov/index.html
    「What’s New」の後ろには、「+」他、演算子のような記号は入っていません。
    しかし今後は、検索する文字列だけでなく、その後ろにも注意します。

  • 2012年4月6日 9:52
     
     

    ご指導ありがとうございます。

    紹介いただいたコードは、私の環境でも「0」が返されました。
    また検索対象となるHTMLファイル
    https://www.cia.gov/index.html
    にもシングルクオートを含む文字列は存在しています。
    見えているシングルクオートのコードが実際に「U+2019」であるかどうかは、EmEditorというエディタの「文字コード値」機能(カーソルの後ろの文字コードを調べられます)で確認しました。
    でも文字コードを使って検索するのはヒントになりました。

  • 2012年4月6日 9:58
     
     回答済み

    # まずヒントになったのなら「参考になった投稿として投票」してほしいところです。

    「文字コードを使って検索するのは解決のヒントになりました」というのは逆に、今まではどのように "検索するキーワード" 部分を入力していたのでしょうか? 正しく U+2019 が入力できていることは確認しましたか?

    次にサンプルプログラムはファイルを読み込んでいますが、ファイルはどのように保存しましたか? 操作する際、エンコーディングが間違っていると、U+2019として保存されない、もしくは読みだした際、U+2019として扱われない可能性があります。

    とりあえず、Google Chromeで保存し、読み込んだ文字列に対して IndexOf("What\u2019s") を実行したらきちんと 0x4220 が返ってきました。

    • 回答としてマーク hrkey 2012年4月10日 8:52
    •  
  • 2012年4月10日 8:18
     
     

    不作法、大変失礼致しました。

    検索対象となるHTMLファイルは、Firefoxで表示させてから「名前を付けて保存/Webページ、HTMLのみ」の機能を使って保存していました(エンコード:UTF-8)。保存したHTMLファイルをテキストエディタで開いておいて、検索したい、シングルクオーテーションを含むキーワードを、同じくエディタで開いたプログラムのソースファイルにコピペしてました。このソースファイルを何も考えずにシフトJISで保存していたので、ご指摘の通り、シングルクオーテーションが正しく扱われなかったようです。

    ソースファイルもUTF-8で保存した場合は、検索するシングルクオートを「\u2019」と指定しても、「’」を入力しても、「-1」でなく正しいと思われる文字位置を返してくれることを確認しました。

    コードの書き方とか、クオーテーションという記号を検索するという問題以前に、検索対象のHTMLの文字コード、ソースファイルを保存する時の文字コードを意識していなかったことが問題だと分かりました。いろいろ説明いただきありがとうございました。

  • 2012年4月10日 8:39
     
     

    コードの例示ありがとうございます。他の方のご指摘で、私の作業上のファイル・エンコードに問題があったということが分かりました。お騒がせしました。

    今度別な質問を投げかける時は、ご指導いただいた通り、動作を確認したい必要な部分だけに絞るようにします。

    問題のシングルクオートですが、検索対象のHTMLファイルをテキストエディタで開いて表示すると確かに全角文字。英語ページの文字は半角英数字だけ、と思いこんでいた私は、そのことを余り深く考えていませんでした。