質問: 255; if (str.getBytes().length > max) { System.out.println("true"); ... ```
回答: 1 byte が 8ビットの環境では、byte 型は 8ビットの符号付整数として扱われます。 この場合 128~255 までの間は最上位ビットが1の状態ですので、みな負の数となります。 例えば 255 は、8ビット整数のすべてのビットが 1 ですので、整数値としては -1 になります。 従って str.getBytes("あ").length の値 (デフォルトの文字コードが、MS932やEUC-JPの場合 2)よりも、 128~255 を byte 型にキャストしたものは小さな値となります。 文字列をバイト列化するのは一つのやり方ですが、その長さを表現するのにまで byte 型を使う必要はないと思います。 整数型の型による違いは扱える数値の範囲です。 想定される数値(この場合は文字列のバイト長)が十分扱える型を選ぶべきです。 byte は -128~127 までしか扱えませんので、255 という値を保持することはできません。 int か long を選ぶべきでしょう。(一般的な用途では int で足りるでしょう) カウントしたバイト数の上限チェックだけを行うのであれば、 最後に示されたコードでだいたいあっていると思います。 ただ、 > > 桁数チェック > > > ということを言われているので、一つ注意点を挙げておきます。 以下のコードを実行すると、 ``` public class Main { public static void main(String[] args) throws Exception { String[] encodes ={ "utf-8" ,"utf-16" ,"MS932" ,"EUC-JP" }; String str = "ABあア"; for (String encode : encodes) { System.out.printf("[%s:%d]\n", encode, str.getBytes(encode).length); } } } ``` 以下のように出力されます。 ``` [utf-8:8] [utf-16:10] [MS932:5] [EUC-JP:6] ``` str.getBytes().length はデフォルトのエンコードでこの処理をやっているので、 環境変数などでデフォルト文字コードが変われば、バイト数は変わってきます。 画面上の桁幅を求めるなどの目的であれば、 描画ライブラリのフォントと文字列を指定することで、 ピクセル数を求めるようなメソッドを利用されたほうが確実だと思います。