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

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

0

あるバイト数での文字の取得 getbytes substring

こんばんは。よろしくお願いします。

あるバイト数で文字を取得したいのですが、どのようにしたら良いですか。

バイト数を得ることはできるのですが、文字数で切るならsubstringで可能なのですが。

たとえば下記で5バイト(abcあ)まで取得したいときです。

        public static void main(String []args) {
            String str = "abcあいうえお";

            try {
                //String -> byte[]
                byte [] bytes = str.getBytes("SJIS"); 

                int aaa = bytes.length;

                if(aaa >= 10 ){
                    System.out.print("over 10");
                }else{
                    System.out.print("under 10");
                }
                //byte [] -> String
                String bb = new String(bytes, "SJIS"); //
                System.out.println(bb);
            } catch (UnsupportedEncodingException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }

5

回答

23999

閲覧

5件の回答

評価

0

一回でできそうにないなら、二回以上に分けて考えるんだ
よ。

評価

0

String bb = new String(bytes, 0, 5, "SJIS");

評価

0

バイト数というのはシフトJIS換算時のバイト数ということでいいんですよね。それなら簡単です。

シフトJISはコード割り当て範囲が非常に上手に設計されていて、シフトJIS文字列中の任意の1バイトを見るだけで、その1バイトが「1バイト文字(英数字)」なのか「2バイト文字の1バイト目」なのか「2バイト文字の2バイト目」なのかを判断できてしまうのです。

シフトJIS2バイト文字の1バイト目は 0x81〜0x9F,0xE0〜0xFCの範囲になります。

基本は質問者さんが書いているコードの通りで、StringをシフトJISのバイト配列にして、バイト配列からStringに戻します。このときにバイト配列の使用する長さを指定することで文字列を切り詰めるわけです。

String bb = new String(bytes, 0, byteLength, "Shift_JIS");

こんな感じです。ちなみに、シフトJISをあらわす文字セットは"Shift_JIS"と書いたほうが良いです。(IANAに登録されている表記なので。)

5バイトで切り詰めたいなら、とりあえず byteLength = 5 とします。次に5バイト目がシフトJIS2バイト文字の1バイト目かどうかを判定します。シフトJIS2バイト文字の1バイト目だった場合は、2バイト目が欠落すると意味がないので、切り出す長さを-1するか+1します。-1して切り詰める場合は以下のようになります。

 String s = "abcあいうえお";
 byte[] bytes = s.getBytes("Shift_JIS");
 
 int byteLength = 5;
 
 int c = bytes[byteLength - 1] & 0xFF;
 if((0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC)) {
  byteLength--;
 }
 
 String bb = new String(bytes, 0, byteLength, "Shift_JIS");

評価

0

ありがとうございます。
下記で問題ないようです。
ありがとうございました。

String bb = new String(bytes, 0, 5, "SJIS");

評価

0



そのそーすで abあいうえおcde でとってみw

abあ? とかになるとおもうがw

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