プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Java、文字列をbyte単位で切り出し
Javaのsubstring()は文字数単位で切り出しなんですよね。

  String str = "aあ1bい2";
  System.out.println(str.substring(2,3));


とかやると「1bい」が返ってきます。
これじゃーうまくない。
このカラムは25バイトしか入らないとか言われてるのにうまくない。

しゃーない、バイト単位で切り出す方法を調べますか。
ふむふむ。

なるほど、一回バイト配列にして指定バイト数分を
再度文字列にしちゃう訳ですね。
例えばこんな感じφ(--)

  str2 = new String(str1.getBytes("UTF-8"), 0, 6, "UTF-8");

この例では文字列の先頭から6バイトのみ切り出されます。
ちなみに意外と地味に気をつけなくちゃいけないのが文字コード(--)b
知っている人からしたら当たり前、
知らないひとからしたらビックリ仰天でしょうが、
UTF-8の場合、日本語は基本的に3バイトです(--)b
ほんで確か特殊文字は4バイトだったよーな。
半角は1バイトで~全角は2バイト、EUC-JPだと3バイトもあったっけ(--?
なんて思わず考えちゃう私みたいなおっさんプログラマーは気を付けて下さい。

さて、完成ヽ(´∀`)ノ
と行きたいのですが、これだとまんまバイトで切っちゃうんですよね。
日本語だろーとなんだろーと律儀にぶった切ってくれる訳です。

そこは気をきかせてさー。
日本語だったら前の文字の終わりで切れよ。
そーゆー気遣い出来るのが仕事が出来る奴って呼ばれるんだぜー。
とか願望を訴えても何とかならないんだから仕方ない。

google先生頼ってみても微妙にしっくりこない。
検索キーワードが悪いのかしら(--?

とうとう面倒臭くなったので自分で作ることにしました。
と言う訳でこんなんなりましたよφ(--)

  public class StrUtil {
      /**
       * 文字列切り出し(Byte単位)<br />
       * <br />
       * 先頭から指定バイト数分文字列を切り出す。<br />
       * 切り出し終了部分が日本語の途中にかかる場合は<br />
       * 直前の文字までを切り出す
       * 
       * @param str String 切り出し対象文字列
       * @param len Integer 切り出しバイト数
       * @param charset String 文字コード
       * 
       * @return    String 切り出し後の文字列
       */
      public static String leftB(String str, Integer len, String charset){
          StringBuffer sb = new StringBuffer();
          int cnt = 0;
  
          try{
              for (int i = 0; i < str.length(); i++) {
                String tmpStr = str.substring(i, i + 1);
                byte[] b = tmpStr.getBytes(charset);
                if (cnt + b.length > len) {
                  return sb.toString();
                } else {
                  sb.append(tmpStr);
                  cnt += b.length;
                }
              }
          } catch (Exception e){
              e.printStackTrace();
          }
          return sb.toString();
      }
  }


やってる事は簡単です。

1.文字を1文字切り出す

2.その文字のバイト数を数える

3.「2.」のバイト数と既に検査した文字の総バイト数を足して
  切り出しバイト数より小さければ文字をStringBufferに追加。

4.「1.」に戻る。

5.「3.」で切り出しバイト数より多ければ
  StringBufferを文字に変換して返却。


要は一文字ずつ地道に調べて足してしてやってる訳です。

  String charset = "UTF-8"
  String msg1 = "あaaaあああいうえお";
  String msg2 = StrUtil.leftB(msg1, 1, charset);
  String msg3 = StrUtil.leftB(msg1, 4, charset);
  String msg4 = StrUtil.leftB(msg1, 10, charset);
  String msg5 = StrUtil.leftB(msg1, 15, charset);


とかやったのが

  分割前文字列:あaaaあああいうえお
  分割後文字列1:
  分割後文字列2:あa
  分割後文字列3:あaaaあ
  分割後文字列4:あaaaああい


みたいに表示されます。

いやー、この手の処理を自分で作ったのは久しぶりですよ(^^ヽ


スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● Java  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事