- PR -

JAVAで、指定したバイト数でStringの文字を抜き出したい

投稿者投稿内容
けんけんぱ
会議室デビュー日: 2005/05/11
投稿数: 12
投稿日時: 2005-05-11 13:20
JAVAで、指定したバイト数でStringの文字を抜き出したいのですが、
方法がわかりません。

文字列は、全角及び半角が混ざっています。


たまき
会議室デビュー日: 2005/02/17
投稿数: 10
投稿日時: 2005-05-11 13:55
こんにちは。

substrではお望みの結果を得られないでしょうか。
私はsubstringしか使用した事がないのですが、指定位置から指定バイトを取得できるとありました。
参考になりましたら幸いです。
_________________
たまき@天
凶暴な兎ほど可愛い!?
TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2005-05-11 14:03
半角文字を1バイト扱いとしたい、という事でしょうか。
(JavaのStringは、Unicode。全ての文字は2バイト)

右上の検索で、「バイト数」あたりをキーワードに検索すれば情報が得られるかと思います。

例えばこの辺り。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10143&forum=12
けんけんぱ
会議室デビュー日: 2005/05/11
投稿数: 12
投稿日時: 2005-05-11 14:08
すみません。
説明不足でした。

String t_String ="123あいうABCDEF";
という文字がありまして、6バイト分を抜き出すとしたら、どのようにしたらいいのでしょうか。
ちなみに
t_String.substring(0,5);
をおこなったところ、「123あい」が、かえってきました。
BBC
常連さん
会議室デビュー日: 2002/03/15
投稿数: 37
お住まい・勤務地: 東京
投稿日時: 2005-05-11 14:19
こんにちは

どのエンコーディングのバイト数かにもよりますが・・・。
例えばShift-JIS(MS932)なら

コード:

try {
String t_String = "123あいうABCDEF";
int b_Length = t_String.getBytes("MS932").length
//後続の処理
}
catch(java.io.UnsupportedEncodingException ex) {
//サポート対象外のエンコード名を指定した場合
}




でバイト長が取得できます。

後はString#substring(int, int)で部分文字列にしながら、
必要なバイト数になるまでチェックを繰り返します。

# [追記] ゴメン。例外が発生する事忘れてました


[ メッセージ編集済み 編集者: BBC 編集日時 2005-05-11 14:34 ]
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-05-11 14:33
シングルバイト文字=ASCII文字ということでしたら、Unicode
でもASCII文字は0xff以下ですので、こんなのでいいのでは。
(テストしていないので境界条件が怪しいです)

コード:
public String getSubStringByte(String src,int len){
  int dstlen = 0;
  for(int i = 0;i < src.length() ;i++){
    dstlen += (src.charAt(i) <= 0xff ? 1 : 2);
    if(dstlen > len)
    return src.substring(0,i);
  }
  return src;
}



半角カナ文字を1バイト扱いしたいなら、Unicodeの半角文字
エリアも1byteで計算すればよいかと。
JVM上でのStringの文字コードはUnicodeですので、これでエ
ンコード非依存になります。
けんけんぱ
会議室デビュー日: 2005/05/11
投稿数: 12
投稿日時: 2005-05-11 14:53
お世話になりました。
みなさんのおかげで、解決しました。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2005-05-12 09:55
引用:

シュンさんの書き込み (2005-05-11 14:33) より:
シングルバイト文字=ASCII文字ということでしたら、Unicode
でもASCII文字は0xff以下ですので、こんなのでいいのでは。
(テストしていないので境界条件が怪しいです)


ASCIIは0x7Fまでですね。
0x80-0xFFはラテン1補助文字で、おそらく半角として
扱いたくないと思われる「±×÷¢£§¬¶°」なども
含まれます。

[追記]間違い。0xA0-0xFFがラテン1補助文字。
0x80-0x9Fは制御コード。
でした。

[ メッセージ編集済み 編集者: JW 編集日時 2005-05-12 09:59 ]

[ メッセージ編集済み 編集者: JW 編集日時 2005-05-12 11:02 ]

スキルアップ/キャリアアップ(JOB@IT)