teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

文字コードに関する記述の誤りを訂正、説明を補充

2016/01/28 17:09

投稿

kozuchi
kozuchi

スコア1193

answer CHANGED
@@ -1,10 +1,60 @@
1
1
  1 byte が 8ビットの環境では、byte 型は 8ビットの符号付整数として扱われます。
2
2
  この場合 128~255 までの間は最上位ビットが1の状態ですので、みな負の数となります。
3
3
  例えば 255 は、8ビット整数のすべてのビットが 1 ですので、整数値としては -1 になります。
4
- 従って str.getBytes("あ").length の値(Javaの場合は内部文字表現が UTF-8なので 2)よりも、128~255 を byte 型にキャストしたものは小さな値となります。
4
+ 従って str.getBytes("あ").length の値
5
+ (デフォルトの文字コードが、MS932やEUC-JPの場合 2)よりも、
5
6
 
7
+ 128~255 を byte 型にキャストしたものは小さな値となります。
8
+
6
9
  文字列をバイト列化するのは一つのやり方ですが、その長さを表現するのにまで byte 型を使う必要はないと思います。
7
10
  整数型の型による違いは扱える数値の範囲です。
8
11
  想定される数値(この場合は文字列のバイト長)が十分扱える型を選ぶべきです。
9
12
  byte は -128~127 までしか扱えませんので、255 という値を保持することはできません。
10
- int か long を選ぶべきでしょう。(一般的な用途では int で足りるでしょう)
13
+ int か long を選ぶべきでしょう。(一般的な用途では int で足りるでしょう)
14
+
15
+ カウントしたバイト数の上限チェックだけを行うのであれば、
16
+ 最後に示されたコードでだいたいあっていると思います。
17
+
18
+ ただ、
19
+
20
+ > 桁数チェック
21
+
22
+ ということを言われているので、一つ注意点を挙げておきます。
23
+
24
+ 以下のコードを実行すると、
25
+
26
+
27
+ ```Java
28
+ public class Main {
29
+ public static void main(String[] args) throws Exception {
30
+ String[] encodes ={
31
+ "utf-8"
32
+ ,"utf-16"
33
+ ,"MS932"
34
+ ,"EUC-JP"
35
+ };
36
+
37
+ String str = "ABあア";
38
+
39
+ for (String encode : encodes) {
40
+ System.out.printf("[%s:%d]\n", encode, str.getBytes(encode).length);
41
+ }
42
+ }
43
+ }
44
+ ```
45
+
46
+ 以下のように出力されます。
47
+
48
+ ```
49
+ [utf-8:8]
50
+ [utf-16:10]
51
+ [MS932:5]
52
+ [EUC-JP:6]
53
+ ```
54
+
55
+ str.getBytes().length はデフォルトのエンコードでこの処理をやっているので、
56
+ 環境変数などでデフォルト文字コードが変われば、バイト数は変わってきます。
57
+
58
+ 画面上の桁幅を求めるなどの目的であれば、
59
+ 描画ライブラリのフォントと文字列を指定することで、
60
+ ピクセル数を求めるようなメソッドを利用されたほうが確実だと思います。

2

256 を 255 に訂正

2016/01/28 17:09

投稿

kozuchi
kozuchi

スコア1193

answer CHANGED
@@ -1,11 +1,10 @@
1
1
  1 byte が 8ビットの環境では、byte 型は 8ビットの符号付整数として扱われます。
2
- この場合 128~256 までの間は最上位ビットが1の状態ですので、みな負の数となります。
2
+ この場合 128~255 までの間は最上位ビットが1の状態ですので、みな負の数となります。
3
3
  例えば 255 は、8ビット整数のすべてのビットが 1 ですので、整数値としては -1 になります。
4
- (実際は桁あふれをおこして255までしか入りません)
5
- 従って str.getBytes("あ").length の値(Javaの場合は内部文字表現が UTF-8なので 2)よりも、128~256 を byte 型にキャストしたものは小さな値となります。
4
+ 従って str.getBytes("あ").length の値(Javaの場合は内部文字表現が UTF-8なので 2)よりも、128~255 を byte 型にキャストしたものは小さな値となります。
6
5
 
7
6
  文字列をバイト列化するのは一つのやり方ですが、その長さを表現するのにまで byte 型を使う必要はないと思います。
8
7
  整数型の型による違いは扱える数値の範囲です。
9
8
  想定される数値(この場合は文字列のバイト長)が十分扱える型を選ぶべきです。
10
- byte は 最大 127 までしか扱えませんので、256 という値を保持することはできません。
9
+ byte は -128~127 までしか扱えませんので、255 という値を保持することはできません。
11
10
  int か long を選ぶべきでしょう。(一般的な用途では int で足りるでしょう)

1

言い回しとの訂正と,s

2016/01/28 14:48

投稿

kozuchi
kozuchi

スコア1193

answer CHANGED
@@ -1,9 +1,10 @@
1
1
  1 byte が 8ビットの環境では、byte 型は 8ビットの符号付整数として扱われます。
2
2
  この場合 128~256 までの間は最上位ビットが1の状態ですので、みな負の数となります。
3
- 例えば 256 は、8ビット整数のすべてのビットが 1 ですので、整数値としては -1 になります。
3
+ 例えば 255 は、8ビット整数のすべてのビットが 1 ですので、整数値としては -1 になります。
4
+ (実際は桁あふれをおこして255までしか入りません)
4
5
  従って str.getBytes("あ").length の値(Javaの場合は内部文字表現が UTF-8なので 2)よりも、128~256 を byte 型にキャストしたものは小さな値となります。
5
6
 
6
- 文字列をバイト化するのは一つのやり方ですが、その長さを表現するのに byte 型を使う必要はないと思います。
7
+ 文字列をバイト化するのは一つのやり方ですが、その長さを表現するのにまで byte 型を使う必要はないと思います。
7
8
  整数型の型による違いは扱える数値の範囲です。
8
9
  想定される数値(この場合は文字列のバイト長)が十分扱える型を選ぶべきです。
9
10
  byte は 最大 127 までしか扱えませんので、256 という値を保持することはできません。