• 締切済み

2バイト文字の判定はString#getBytes().length

.

  • jun-1
  • お礼率9% (1/11)
  • Java
  • 回答数11
  • ありがとう数24

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.11

 文字列中の文字の特定のエンコーディング形式でのバイト数は、 文字列を一文字ずつの文字列に分解してそれをバイト変換してその長さを調べればよいと思います。 また、文字のバイト数はエンコーディング形式によっても変わります。 下の例は、指定された文字列のそれぞれの文字のバイト数をUTF-16,UTF-16BE,SJIS,UTF-8で調べるプログラムです。 public class bytelen { private static void GetByteLength(String str, String enc) { byte b[]; int i; try { System.out.print("type=" + enc + ":"); for (i = 0; i < str.length(); i ++) { b = str.substring(i, i + 1).getBytes(enc); System.out.print(b.length); }; System.out.println(""); } catch (Exception ex) { System.out.println(ex.toString()); }; }; public static void main(String args[]) { System.out.println("source=" + args[0]); GetByteLength(args[0], "UTF-16"); GetByteLength(args[0], "UTF-16BE"); GetByteLength(args[0], "SJIS"); GetByteLength(args[0], "UTF-8"); }; }

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.10

おそくなりましたが返信いたします。 #8で示されたもので 期待された結果がえることができました。 ありがとうございました。 この質問のオーナーではないのですが、 大変参考になりました。

  • lawson
  • ベストアンサー率44% (29/65)
回答No.9

<<<<<<訂正>>>>>> 誤) -----------*------------------- Nが4の時にNo5で示されたパターンに ついて 正) -----------*------------------- Nが4の時にNo7で示されたパターンに ついて

  • lawson
  • ベストアンサー率44% (29/65)
回答No.8

No7に対する回答です 現場のルータが故障してしまい。 しばらく、ネットに出ることができません でした。 左様であれば以下の コードをコンパイルして実行して みてください。 ご期待に添えるような結果だったでしょうか? Nが4の時にNo5で示されたパターンに ついて ################################################ ################### Nが [4]の時 ############### ################################################ [aaaaa] -> [aaaa] [aaaあa] -> [aaa] [あaaaa] -> [あaa] [ああaaaa] -> [ああ] [aaaaあ] -> [aaaa] [aaaaaあ] -> [aaaa] のように 網羅されています。 以下、ソースコード。 class LSN { private boolean foo(String str, int index) { String temp = "" + str.charAt(index); if( temp.getBytes().length == 2 ) { return true; } return false; } public String bar(String target, int targetIndex){ //targetIndexは切り出しの終端について~文字目かを //あらわす、1ベースインデックスなので、 //ゼロベースインデックスに変換 targetIndex--; if( targetIndex < 0 ) { return ""; } String retStr = ""; //下記のfor文中に宣言した「i」は~文字目かをあらわす、ゼロベースインデックス //「byteIndex」は~バイト目かをあらわす、ゼロベースインデックス int byteIndex = 0; for(int i = 0 ; i < target.length() ; i++) { boolean b = foo(target, i); if( b ) { //2バイトの先頭の時 if( byteIndex == targetIndex ) { //2バイトの先頭の時にあたるバイト数が //指定された切り出しバイト数目と同一であった場合は //ここで、処理を終える return retStr; } } retStr += target.charAt(i); if( b ) { //現在注目している文字は2バイト文字だったので、 //次回のバイトのインデックスのために、2進める必要あり byteIndex += 2; } else { //現在注目している文字は1バイト文字だったので、 //次回のバイトのインデックスのために、1進める必要あり byteIndex++; } //次回のバイトのインデックスは切り出し終端を越えるものなので //これ以上処理を続行してはならない。 if( byteIndex > targetIndex ) { return retStr; } } //切り出し終端に達する前に、文字列そのものを最後まで舐めた場合 return retStr; } public static void main(String[] args) { LSN lsn = new LSN(); for( int n = -1 ; n < 7 ; n++ ) { System.out.println("################### Nが [" + n + "]の時 ###############"); System.out.println("#######################################################"); if( n <= 0 ) { System.out.println("[Nがゼロ以下の時は出力はすべて空文字]"); } String targetStr1 = "aaaaa"; int targetIndex1 = n; System.out.println("[" + targetStr1 + "]" + " -> [" + lsn.bar(targetStr1, targetIndex1) + "]"); String targetStr2 = "aaaあa"; int targetIndex2 = n; System.out.println("[" + targetStr2 + "]" + " -> [" + lsn.bar(targetStr2, targetIndex2) + "]"); String targetStr3 = "あaaaa"; int targetIndex3 = n; System.out.println("[" + targetStr3 + "]" + " -> [" + lsn.bar(targetStr3, targetIndex3) + "]"); String targetStr4 = "ああaaaa"; int targetIndex4 = n; System.out.println("[" + targetStr4 + "]" + " -> [" + lsn.bar(targetStr4, targetIndex4) + "]"); String targetStr5 = "aaaaあ"; int targetIndex5 = n; System.out.println("[" + targetStr5 + "]" + " -> [" + lsn.bar(targetStr5, targetIndex5) + "]"); String targetStr6 = "aaaaaあ"; int targetIndex6 = n; System.out.println("[" + targetStr6 + "]" + " -> [" + lsn.bar(targetStr6, targetIndex6) + "]"); System.out.println("#######################################################"); } } }

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.7

#5補足説明です。 ある文字列を指定したバイト数nできったときに 文字列として表現できるならばn byte目まで表示 n byteで切ったときに文字列として表現できなければ n以下でもっとも長く文字列として表現できるようにする。 がお題になります。 たとえば str1 = "aaaaa" でn=4ならば ans1 = "aaaa" です。 str2 = "aaaあa" でn=4 ならば ans2 = "aaa" str3 = "あaaaa" でn=4 ならば ans3 = "あaa" str4= "ああaaaa" でn=4 ならば ans4= "ああ" です。 で、いろいろ考えて前質問のような形に行き着いた次第です。

  • lawson
  • ベストアンサー率44% (29/65)
回答No.6

No5に対する回答です 左様であれば、 以下のソースをコンパイルして 実行してみてください [aaaあb] -> [aaa] [aaab] -> [aaab] [あaaab] -> [] のように変換される結果が得られます ご期待に添えるような結果だったでしょうか? class AAA4 { private boolean foo(String str, int index) { String temp = "" + str.charAt(index); if( temp.getBytes().length == 2 ) { return true; } return false; } private String bar(String target){ String ret = ""; for(int i = 0 ; i < target.length() ; i++) { boolean b = foo(target, i); if( b == true ) { return ret; } ret += target.charAt(i); } return ret; } public static void main(String[] args) { AAA4 aaa4 = new AAA4(); String targetStr1 = "aaaあb"; System.out.println("[" + targetStr1 + "]" + " -> [" + aaa4.bar(targetStr1) + "]"); String targetStr2 = "aaab"; System.out.println("[" + targetStr2 + "]" + " -> [" + aaa4.bar(targetStr2) + "]"); String targetStr3 = "あaaab"; System.out.println("[" + targetStr3 + "]" + " -> [" + aaa4.bar(targetStr3) + "]"); } }

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.5

#3です。 <引用> ただ、「指定したバイト数目が2バイト文字」 は変ですね。 だって指定したバイトはバイトなんだから1バイトでしょ。 正しくは「指定した文字数目が2バイト文字」 ではないでしょうか。 </引用> いま思うととてもおかしな日本語でした。 以下のように訂正いたします。 指定したバイト数目が2バイト文字の先頭のバイトではない という表現にします。 これは aaaあb という文字列があった場合に 4byte目は"あ"という文字の先頭バイトが入ると思います。 この場合はaaaというようにしたかったのです。 byte単位で文字列をきった場合に 途中で切れてしまう場合には一個前の文字までにする という処理がしたかったです。

  • lawson
  • ベストアンサー率44% (29/65)
回答No.4

No3に対する回答です >>しかし指定したバイト数目が2バイト文字かどうかを >>うまく判定するにはどうしたらよいものかということで >>前回の質問をした次第です。 「指定したバイト数目が2バイト文字かどうかを うまく判定する」という話であれば、 私のNo1の回答のメソッドを 以下のように改造すればよいでしょう。 ただ、「指定したバイト数目が2バイト文字」 は変ですね。 だって指定したバイトはバイトなんだから1バイトでしょ。 正しくは「指定した文字数目が2バイト文字」 ではないでしょうか。 1つ目の引数が調べたい文字列 2つ目の引数が指定した文字数目をあらわす添え字(0文字目から始まる) private boolean foo(String str, int index) { String temp = "" + str.charAt(index); if( temp.getBytes().length == 2 ) { return true; } return false; } 以上

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.3

お世話になります。 前回この下の問題で質問をしものです。 前回の質問の背景は 2バイト文字の判定をするときに 2バイト文字であるならば必ず一バイト目がマイナスになるかどうかを確証を得るために質問いたしました。 2バイト文字の判定となると 皆様のご指摘の通りで getBytes().length == 2 で行うのが自然と思われます。 しかし指定したバイト数目が2バイト文字かどうかを うまく判定するにはどうしたらよいものかということで 前回の質問をした次第です。 ※指定した文字数目が2バイトかどうかの判定は getBytes().lengthでも自然な形で判定可能と思われます。 質問の回答ではありませんが、 補足説明をこの場を借りてさせていただきました。

  • t-satoh
  • ベストアンサー率35% (211/591)
回答No.2

 文字列中に2バイト文字があるかどうかだけなら、 下記のようにするだけで判定可能かと。(^^;) //サンプル import java.io.*; class Test{ public static void main(String[] args){ System.out.println(hasTwoByteCharacter(args[0])); } private static boolean hasTwoByteCharacter(String str){ try{ if(str.length()==str.getBytes("Windows-31j").length) return false;//2バイト文字なし else return true;//2バイト文字あり }catch(UnsupportedEncodingException e){ return false; } } }

関連するQ&A

  • String型の値が大文字か小文字か判定する

    いつもお世話になっています。 String型の値が、大文字か小文字か判定することはできないのでしょうか? char型だと Charactereクラスを使用し判定が可能なのですが。 ◆char型の場合◆ List list = new ArrayList(); //比較する文字列 String mozi = "Abc"; //ループ for(int m=0;m<mozi.length();m++) { //文字を順に小文字かどうか調べる char ccc = mozi.charAt(m); //小文字の場合に限りlistに格納 if(Character.isLowerCase(ccc) == true) { list.add(ccc); } } //表示 for(int l=0;l<list.size();l++) { System.out.println("list="+list.get(l)); } したいのが、 ◆String型◆ List list = new ArrayList(); List list2 = new ArrayList(); list.add("TEST"); list.add("sam"); list.add("OSIETE"); for(int l=0;l<list.size();l++ ) { String compareMozi =(String) list.get(l); //ここで文字列compareMoziが大文字か小文字か調べて、小文字のときだけlist2に格納する } な感じです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • Stringクラスのlengthメソッドについて

    こんにちは、Stringクラスのlengthメソッドについて質問させてください。 今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。 ArrayListだとかは長さが変わるからメソッドという意識を持っていました。 (カプセル化の概念とも関わりますが) 先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。 確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。 言語仕様として一貫性を持たせるなら、配列もlengthメソッドにするか、文字列をlengthフィールドにしたほうが綺麗だと思うんです。 Stringクラスのソースコードを見ていたら、文字列の長さは内部的に private int count; と宣言されていました。 そして、lengthメソッドは return count; しているだけでした。 ただ、このcountフィールドに値を代入しているのはコンストラクタ内だけだったので、 public final int length; とすれば、良かったのでは?と思いました。 この考えについて、 それは間違っている、とか歴史的な背景などご存知でしたらご教授ください。 よろしくお願致します。

  • 2byte文字の判定

    お世話になります。 2バイト文字かどうかの判定のやり方ですが、 String a = "";//←判定したい1文字(とりあえずStringとします) byte[] b = a.getByte(); if((int)b[0]<0){ //2byte文字 }else{ //1byte文字 } という判定の方法はありですか? それとも根本的に考え方間違えてますでしょうか??

    • ベストアンサー
    • Java
  • String(文字列)と配列の length の違いについて

    Stringと配列、それぞれlengthがありますが、 Stringはlength()とカッコが付き、配列の場合、例えば intarray.lengthのようにカッコが付きません。 両者でなぜ扱いが違うのか、教えていただけますか?

  • string(0) ""判定 php

    ・string(0) ""判定は、どう書くのでしょうか? ・if(変数===""){ ・それともempty?

    • ベストアンサー
    • PHP
  • $length * $length;はなんと呼ばれ

    phpで $length = 7 $area = $length * $length; echo $area; $length = 7 これはlengthが変数ですよね? では、 $area = $length * $length; この$areaは変数ですか? だとすると、$length * $length;はなんと呼ばれますか?

    • ベストアンサー
    • PHP
  • レングスとは?

    「レングス○○cm」とかパンツのサイズで書いてあるのは、股下のことなのでしょうか? 超基本的なことを質問して申し訳ありません…。

  • lengthで返ってくるバイト数の計算があいません

    お世話になります。 lengthで返ってくるバイト数の計算があわず困っています。 全角文字列と全角スペースをあわせて12文字(24バイト)の出力をさせたくて以下のように記述しました。 $spaceStr = ' ' x ((24 - length($in{'name'}))/2); $in{'name'}には全角の名前が入るようにしています。 最終的に$spaceStrをテキストに出力したいのですが、 例えば$in{'name'}が「あ」の一文字の場合、期待では ' ' x ((24 - 2)/2) なので11文字の全角スペースが出力されると思ったのですが、出力は9文字の18バイト分の全角スペースしか出力されません。 この原因は何でしょうか? ご教授の方をよろしくお願いします。

    • ベストアンサー
    • Perl
  • レングスはどれくらいですか?

    こんにちは 身長169cmの男です。 パンツを買う場合 レングスはどれくらいですか? 個人差があると思うので目安を教えて下さい。 よろしくお願い致します。

  • length()の使い方がわかりません

     java初心者です、宜しくお願いします。    lengthを配列につかってやるとlength()とするとエラーになります。  また、文字列ではlength()としないとエラーになります。  どこかこのプログラムが間違っているのでしょうか。   色々と参考書とかWEBで調べてもさっぱりわかりません。  どなたか宜しくご教示お願い致します。 ================================================================= public class H1 { public static void main(String[] args) { int d[] = {1,2}; String s = "abcd" ; System.out.println(d.length); System.out.println(s.length()); } }

    • ベストアンサー
    • Java

専門家に質問してみよう