Headline About TechLog Download Java VBA Link

February 1, 2012.

Javaにおける固定長文字列作成について


Javaをやってて意外に困るのが固定長切り出し処理。業務用アプリ開発なんかだと、IFデータとして固定長ファイルの読み書きが必要なことは多いのだが、Javaでこれを実現しようとすると意外に手間取る事になる。

getLength()やsubstring()では事足りないってのは誰でも知ってる。半角文字も全角文字も同じ一文字にカウントされるからだ。なので、VBなんかだとMidB()とかを使うのだが、2byte文字が混じってると半分に切れちゃったりするから、結局1文字ずつMidした結果をLenBして固定長文字列を作る。

Javaでも同じような手順が必要だが単純にgetBytes()するとうまくいかない。なぜならJavaの内部コードはUTF-16であり、getBytes().lengthでちょっと以外な数値が返ってきてしまうからだ。

なので、getBytes()の際にクライアント環境の文字コードを指定する。サンプルは以下。この手法は『ある幅に印刷可能な部分文字列』なんかを取得する際にも応用できる。固定幅フォント限定だが、携帯ゲーム作成時など、Graphicsクラスを経由しないので手軽である。

 

public String utfFix(String str, int length) throws Exception {

  String ENC = "Windows-31J";

  int index = 0;

  StringBuffer buf = new StringBuffer();

  for (int i = 0; i < str.length(); i++) {

    String s = str.substring(i, i + 1);

    int len = s.getBytes(ENC).length;

    if (index + len <= length) {

      buf.append(s);

      index += len;

    } else {

      break;

    }

  }

  for (int i = 0; i < length - index; i++) {

    buf.append(" ");

  }

  return buf.toString();

}


名前: 意見: パス:

※パスにはこの日記のタイトルをコピペして下さい。


February, 2012
SUN MON TUS WED TUR FRI SAT
1234
567891011
12131415161718
19202122232425
26272829