Java開発では文字列のバイト数を取得したり、指定したバイト数分だけ文字列を抽出したいといった処理はよくあります。
本記事では、Javaで文字列のバイト数を取得する方法について、サンプルコードを掲載しながらご紹介していきます。
目次
Javaで文字列のバイト数を取得する方法
Javaで文字列のバイト数を取得する場合、Stringクラスの「getBytes().length」を利用することが可能です。
エンコーディング方法を指定
文字列のバイト数はエンコーディング方法により異なるため、取得する際にエンコーディング形式を指定してあげる必要があります。
文字列.getBytes("UTF-8").length 文字列.getBytes("Shift_JIS").length
getBytesの引数として「UTF-8」や「Shift_JIS」などのエンコーディング形式を指定します。
StringUtilsを使った方法
文字列のバイト数はStringUtilsクラスが提供する「getBytes」メソッドを使用することでも取得出来ます。
StringUtils.getBytes(文字列[, エンコーディング形式])
第2引数にはエンコーディング形式を指定することが出来ますが、指定しなかった場合は実行環境でのデフォルト文字コードでバイト数が取得されます。
文字列長との違いに注意
Stringクラスには同じく「length」を使って文字列長を取得することが可能です。
文字列.length()
この記述方法では指定した文字列の文字数が結果として取得出来ます。
自分がバイト数と文字列長のどちらを取得したいかで使い分けられるよう意識しておきましょう。
バイト数を取得するJavaサンプル
では実際に文字列からバイト数を取得するJavaのサンプルコードで、処理の内容について詳しく確認していきましょう。
サンプルコード1
1つ目はシンプルにバイト数を取得するメソッドと文字数を取得するメソッドで違いを確認してみます。
import com.mysql.cj.util.StringUtils; public class Main { public static void main(String[] args) { try { System.out.println("あいうえお".getBytes("Shift_JIS").length); System.out.println(StringUtils.getBytes("あいうえお", "Shift_JIS").length); System.out.println("あいうえお".length()); } catch (Exception ex) { ex.printStackTrace(); } } }
実行した結果が下記です。
10 10 5
7行目、8行目では取得方法を変えてShift_JIS形式でのバイト数を取得しており、9行目では文字数を取得するコードを記述しています。
サンプルコード2
次は7行目の文字コード指定を「UTF-8」に変えると取得結果にどのような変化があるのか確認してみましょう。
import com.mysql.cj.util.StringUtils; public class Main { public static void main(String[] args) { try { System.out.println("あいうえお".getBytes("UTF-8").length); System.out.println(StringUtils.getBytes("あいうえお", "Shift_JIS").length); System.out.println("あいうえお".length()); } catch (Exception ex) { ex.printStackTrace(); } } }
実行した結果が下記です。
15 10 5
UTF-8に変更したことにより出力結果が変わっており、理由はUTF-8の場合日本語の文字が3バイトとして換算されるためです。
サンプルコード3
ではStringUtilsでエンコーディング形式を指定せずに実行した結果も確認しておきましょう。
import com.mysql.cj.util.StringUtils; public class Main { public static void main(String[] args) { try { System.out.println("あいうえお".getBytes("UTF-8").length); System.out.println(StringUtils.getBytes("あいうえお").length); System.out.println("あいうえお".length()); } catch (Exception ex) { ex.printStackTrace(); } } }
実行した結果が下記です。
15 15 5
今回のサンプルでは実行環境のデフォルトエンコーディング形式がUTF-8なので、15バイトとして出力されていることが分かります。
Javaで文字列から任意のバイト数分抽出する
Javaではバイト数を基準に文字列を切り出すためのメソッドが用意されていません。
そこで文字数を切り出す「substring」メソッドを応用させることで、バイト数に応じた文字列を抽出することが可能となります。
サンプル
public class Main { public static void main(String[] args) { try { int targetByte = 7; int count = 0; String targetString = "あいうえお"; String result = ""; for(int i = 0; i < targetString.length(); i++) { String tmp1 = targetString.substring(i, i + 1); byte[] tmp2 = tmp1.getBytes("UTF-8"); result = result + tmp1; if(count + tmp2.length > targetByte) { break; } else { count = count + tmp2.length; } } System.out.println(result); } catch (Exception ex) { ex.printStackTrace(); } } }
実行した結果が下記です。
あいう
解説
サンプルコードでは、対象の文字列(7行目)を1文字ずつ取り出し(10行目)バイト数をまず取得(11行目)しています。
これまでに抽出した文字列の合計バイト数が指定バイト数(5行目)に達しているかを確認(14行目)し、該当文字列をコンソールに出力(21行目)するサンプルです。
今回はサンプルということでmainクラスに全ての処理を記述していますが、メソッドとして切り出すことで指定文字列や指定バイト数を引数に渡して切り替えるような処理の書き方も可能です。
さいごに: Javaでバイト数を確認するにはgetBytesメソッドを利用する
本記事では、Javaでバイト数を確認する方法についてサンプルコードを掲載しながらご紹介していきました。
バイト数を取得する際は、文字列のエンコーディング形式を意識することが大切です。
エンコーディング方法により取得結果が変わってきますので、デフォルト指定で実行する際にもエンコーディング形式が意図したものであるかは把握しておくようにしましょう。