Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

文字列の分割について

ある特定の長文の文字列を一定バイト数毎に区切りたいのですが、
半角と全角が入り混じっている為単純に特定のバイト数毎に分割してしまうと文字化けを起してしまう可能性があります
何かいい方法はないでしょうか?
以下の例のように出来れば最善なのですが・・・

例)
長文:あああああああiiiiiiiうううううeeeeeおおおお

4バイト毎に区切る
ああ
ああ
ああ
あii
iiii
iう
うう
うう
eeee
eお
おお

4

回答

11221

閲覧

4件の回答

評価

0

まず、文字コードを指定してください。
ShiftJISやEUC-JPなどであれば、例として上がっているような問題が起こりますが、
Javaは、基本的にはUnicode(全部2バイト)で動作しています。

ShiftJISなどである場合、自前で切り出すことになります。

1. 3バイト読み込む(残り3バイトなければ全部)。
2. 次の1バイトが文字コードの第一バイトであれば、その3バイトで文字列を作り、1に戻る。それ以外はつけたした4バイトで文字列を作り、1に戻る。

という感じの操作になるでしょう。
Javaは、可能な限り環境に依存しないようにするために、文字の種類はあまり考えないようにしています。
(そもそも、「全角」「半角」という考え方自体が、環境によっては通用しないので)
なので、あえて考えたい場合は、自分で作りこむ必要があります。

評価

0

以下の手順でどうでしょう?

1.substring で一文字切り出す
2.getBytes で byte[] 配列を得る
3.length で長さを得る
4.目的のバイト数になるまで適切に判断して追加する

評価

0

完成しました。まぁまぁのデキかな。

String s = "あああああああiiiiiiiうううううeeeeeおおおお";
int len = 4;
StringBuffer sb = new StringBuffer();
int count = 0;

for (int i = 0; i < s.length(); i++) {
  String ss = s.substring(i, i + 1);
  byte[] b = ss.getBytes();
  if (count + b.length > len) {
    System.out.println(sb);
    sb = new StringBuffer(ss);
    count = b.length;
  } else {
    sb.append(ss);
    count += b.length;
  }
}

評価

0

mioさん、某師さん
大変有用な情報を有難うございます。
両方の方法を試してみてより仕様に近いほうを使わせて頂こうと思います。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。