文字列

 Processingにおける文字列の処理法を紹介します。Processingでは文字は utf-8 と呼ばれるコードで記録されます。これは、英数字は 1バイトで表現しますが、多くの漢字は3-4バイトで表現されます。文字列に対しては、+ 演算で文字列を「つなぐ」ことができます。また、文字列をグラフィックスとしてフォントやサイズを指定して表示することもできます。


  1. 文字列定数

     1文字は 'a' のように ' で括り char 型変数に記録できます。文字列は "漢字" のように " で括ります。「文字配列」に1文字づつ記録することはできますが、文字列を直接代入できません。
    char c1='漢';
    println(c1);
    char sa[]={'漢','字'};
     挿入や削除などの文字処理で長さが変化するため配列では処理が厄介で、次の String を利用します。
  2. Stringクラス

     「文字列」は String で効率よく処理できます。「文字列」は String 型の変数にそのまま代入できます。文字の配列から new で String 変数に代入することもでき、println() で表示することもできます。 str(オブジェクト)で、オブジェクト(整数、文字配列など)を String に変換できます。
     String st="漢字";
     println(st);
     st = new String(sa);
     println(st);
     String には、他に多くの機能が用意されています。文字列や String 型の変数に記録された文字列は + 演算で文字の接続ができます。また、文字列と数値型変数を + 演算すると数値は文字列に変換されて + 演算されます。
     文字列の長さは length() で取得できます。文字列の一致は equals(文字列)を利用します。 == では文字列のある記憶領域の場所の比較になります。
      //文字列を加える
      String kyou="明日";
      String tenki="晴れるか";
      kyou = kyou + tenki;
      println(kyou+":"+kyou.length());
      int it=120;
      println(kyou + ":"+ it );
     println(tenki.equals("晴れるか"));
      println(tenki == "明日晴れるか");
    
    ///結果
    明日晴れるか:6
    明日晴れるか:120
    true
    false
    
     charAt(整数) で文字列から「指定した番号の文字」を取り出すことができます。先頭の文字は第 0 番の文字になります。substring(2,4) では 文字列から「指定した番号の範囲の文字列」を抜き出すことができます。indexOf(文字列)では指定した文字列を検索し、存在する場合先頭の文字の番号を返し、存在しない場合 -1 を返します。
      //1文字取出し
      char c2 = kyou.charAt(1);
      println(c2);
      //文字列取出し
      println(kyou.substring(2,4));
      //文字列検索
      println(kyou.indexOf("晴れる"));
    
    ///結果
    日
    晴れ
    2
    

  3. Stringの配列と検索

     String の配列もどうように利用できます。県名の配列と対応する人口(単位1000人)の配列が与えられたとき、件名から人口を求めるプログラムを紹介します。
    String name[]={"愛知","岐阜","三重","静岡"};
    int pop[]={7410,2080,1854,3765};
    int i,jk=-1;
    String ken="三重";
    for (i=0;i<name.length;i++){
      if(ken.equals(name[i])) {//一致チェック
        jk=pop[i];
        break;
      }
    }
    if (jk>=0)println(jk);
    else println("見つかりません");
    ///結果
    1854
     途中で一致したら break で繰り返しを中断します。終了しても jk が -1 なら一致するものがなかったことになります。
  4. 文字列の描画

     println(文字列)では文字列を 編集画面の下のコンソール画面に表示できますが、書体や大きさを指定することは出来ません。文字列をグラフィック画面に表示するには text() メソッドを利用します。(x,y)座標を原点として、既定のフォント、サイズ(12)と色(白)で文字列を表示します。
      text(文字列, x 座標, y座標);
     既定のフォントでは漢字を表示することは出来ません。textSize() で文字のサイズ、fill(色)で文字の色を指定できます。サイズの単位は画素になります。text() で最後に、幅と高さを追加すると、長い文字列を折り返して表示します。
    void setup(){
     size(150,180);
     noLoop();
    }
    void draw(){
      text("ABC",20,20);
      fill(200,0,0);
      textSize(16);
      text("ABC",20,50);
      fill(0,200,0);
      textSize(20);
     
      text("ABC",20,80);
      fill(200,200,200);
      rect(20,100,80,60);
       fill(0,0,0);
      text("ABCDEFGHIJK",20,100,80,60);
    }
    実行結果


  5. 文字フォント

     漢字や他の「フォント」を利用したい場合、まず、Processing の Toolsメニューで createFont を利用し「フォントファイル」を作成します。「フォントファイル」は作成プログラムと同じフォルダ内の data フォルダに作成されます。したがって、フォントファイルを作成する前に、プログラムを保存しておく必要があるます。
     作成するとき、フォントのサイズとファイル名を選択できます。フォントのサイズは使用するフォントのサイズと同じかより大きなサイズを指定します。フォントファイルは使用している OS のフォントファイルから作成されます。


     組み込んだファイルは Sketch メニューの 「Show Sketch Folder」でも確認できます。
    この フォントファイルを loadFont() で PFont のインスタンス gfont に読み込み、textFont (gfont, 20); でサイズを指定して、使用するフォントを指定します。
     下の例では、あらかじめ漢字が利用できる MS-Gothic をサイズ24 で作成しておきます。text() メソッドで表示枠の幅を狭くして(30)、疑似的な縦書きをしています。
    PFont gfont;
    void setup() {
      size(80, 160);
      background(0);
      smooth();
      //漢字を含むフォントを利用する
      gfont = loadFont("MS-Gothic-24.vlw");
      textFont(gfont, 20);
      noStroke();
      noLoop();
    }
    void draw() {
      fill(128);
      rect(0, 0, width, height);
      fill(255, 255, 0);
      //横幅は2文字より狭くする
      text("おめでとう", 30, 20, 30, 350);
    }
    実行結果


     この方法では、文字の間隔や行間は自由に変更できません。文字を1文字づつ取出し文字間隔や行間を設定して描画すれば、任意の文字配置で文字描画ができます。

  6. まとめ

     文字列表示は情報を伝える一番基本的な機能になります。文字列が「化ける」場合、使用する文字のコードを確認してください。Windows では、また、多くの場合 シフトJISコードが利用されています。Processing では他に「正規表現」による マッチング機能も標準で組み込まれていますが、ここでは割愛します。
     ディスプレイウインドウに表示された画面は、画像ファイルとして書き出したり、PDF ファイルの形式に保存することも可能です。