• 締切済み

文字列の長さ

こんにちわ。 現在、1バイトと2バイト文字混在の文字列の長さを 1バイト文字の長さは1 2バイト文字の長さは2 で知りたいのですが、String.lengthでは2バイト文字も長さ1になってしまいます。 String.getBytesを使用して何とか出来そうなのですが・・・ 宜しくお願いします。

  • Java
  • 回答数1
  • ありがとう数3

みんなの回答

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

byte[] のサイズはどうやれば知ることができるのか、ってことですか? import java.lang.reflect.Array; class G { public static void main(String[] arg) { String s = new String("あ"); System.out.println("getBytes() = " + Array.getLength(s.getBytes())); } } こういうこと?

関連するQ&A

  • 文字列比較

    最長10文字の文字列を2件入力し、char型の配列にそれぞれ格納する。2つの文字列を比較し、文字列が同じだったら「equal」を表示し異なっていたら「Not equal」を表示するプログラムを作成せよという課題が出ました。 条件として、11文字以上の文字が入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。下記のプログラムで文字列1に11文字以上入力すると、うまく動きません。なぜ、うまくいかないかと、どうなおしたらよいかを教えてください。 #include<stdio.h> #include<string.h> #define max_length 10 void get_string (char *p_str, int size); int main() { char string1[max_length+2]; char string2[max_length+2]; printf("文字列1:"); get_string(string1,max_length+2); printf("文字列2:"); get_string(string2,max_length+2); if(!strncmp(string1,string2,max_length)) puts("equal"); else puts("Not equal"); } void get_string (char *p_str, int size) { fgets(p_str,size,stdin); }

  • 文字列分割方法

    フォームから入力されたデーターを文字数により4分割したい場合、 シングルバイトとマルチバイト文字列が混在していると、文字化けが起こってしまいます。 私が考えた方法は <?php $test="あああああいいいいいうううううえええええ"; $length = strlen($test); $length2 = (int)$length/4 $quarter[] = substr($test,0,$length2); $quarter[] = substr($test,$length2,$length2); $quarter[] = substr($test,$length2*2,$length2); $quarter[] = substr($test,$length2*3,$length2); echo $quarter[0]."<BR><BR>"; echo $quarter[1]."<BR><BR>"; echo $quarter[2]."<BR><BR>"; echo $quarter[3]."<BR><BR>"; ?> というものだったんですが、この場合$testに半角文字のaなどが入ると 文字化けしてしまいます。 上手く、マルチバイト・シングルバイト複合文字列を文字数により4分割する方法はないでしょうか? ご教授ください

    • ベストアンサー
    • PHP
  • 0バイト文字の送信

    C#ですが、C/C++でも同じだと思うので、 お願いします。 たとえば、"abcde"という文字を、終端文字0バイト として、送信したいのですが、どうしたらいいので しょうか。 string mys="abcde"; byte[] mybyte=new byte[1024]; mybyte=Encoding.UNICODE.GetBytes(mys); mynetwork.Write(mybyte,0,mybyte.Length); こんな感じで、書き出すつもりですが、終端が、 0バイトには、なっていないようです。 (ちなみに、JAVAだと、文字列を、送るので "abcde\0"で、うまくいきます。バイト配列で 送る場合が、わかりません。 分かる人がいましたら、お願いします

  • 環境に依存しない文字長(日本語含む)の取得方法

    Stringデータ(日本語含む)の文字長を取得したいと考えています。 但し、日本語は2byte文字としてカウントしなくてはいけません。 で、今まで、 String.getBytes().length; で取得していたのですが、何かのタイミングで日本語を2byteとして扱えず、 「あいうA」を4byteと算出してしまうことがありました。 それで、getBytes()の引数にgetBytes("SJIS")と明示して取得することで、環境に依存しないbyte配列変換ができるのかなぁ、、と思っていますが、 この対応は間違っていないのでしょうか? また、これ以外の日本語byte数のカウント方法で「環境に依存しない」はあるのでしょうか? ご教授願います。

  • 文字列取得 substrではできません。

    1バイト2バイト混在文字列を substrで取得すると、2バイト文字が半分になるため最終文字が文字化けします。 1、2バイト混在文字をうまく取得できる関数はありますか?

    • ベストアンサー
    • PHP
  • EUC_JPの文字化け

    指定された文字列(String型)を以下の様にバイト配列で保持し、 byte[] work = "指定文字列".getBytes(encoding); そのバイト配列を使用し、再度、以下の様にStringを生成します。 new String(work, encoding); (作成したプログラムを添付したいのですが、文字数の関係で割愛します。) 指定文字列は機種依存文字(丸数字等)にします。 この時、encodingにMS932、UTF-8等を指定した場合は問題なく元の文字列が 取得できますが、EUC_JPを指定すると、?に文字化けを起こします。 調査すると、getBytesでbyte配列を取得した時点で既に変換不良を起こしていました。 (丸数字全てが0x3fになっていました。期待していたコード、というか本来は、0xADA1~0xADB4のはずです。) そこでStringクラスのgetBytesメソッドをオーバーライドしちゃえという、甘い考えが浮かび、 javaのソースコードでString.javaを見ましたが、結局のところ、どこでコード変換を行っているのか よくわかりませんでした。 そこで質問です。 1)これはJDKのバグなのですか? 2)こんな経験がある。あるいはこういう対処をした。というかた、おりましたら、   参考URLでも構いませんが教えてください。 以上、よろしくお願いします。

  • vb2008で文字列から文字列コードを取得する方法

    サイトHTMLをWebBrowserを使用せずに取得するために、 Dim stream As System.IO.Stream = client.OpenRead(tbItemURL.Text) Dim reader As New System.IO.StreamReader(stream) Dim strHtml = reader.ReadToEnd() reader.Close() stream.Close() のような形で文字列を取得しています。 しかし、この場合Sift-jis等の場合、後の作業(一部データ取得)で文字化けに悩まされます。 http://dobon.net/vb/dotnet/string/detectcode.html 上記サイトで「バイト配列」に格納して判別する方法があります。 そこで、文字列をバイト配列に格納しようとしますが…。 文字列→バイト配列には文字コードが必要となります。 Dim data() As Byte = Encoding.UTF8.GetBytes(text) なんだか鶏と卵のような感じになってしまいます。 文字列から文字コードを判別する方法はないでしょうか? よろしくお願いします。

  • 日本語文字列の指定長(byte)切出し

    以下は日本語文字列(EUC)の指定長(byte)切出し関数なのですが、 これをShift-JIS版にするにはどうすれば良いのでしょうか? ================================================================ sub jcut { # 日本語文字列(EUC)の指定長(byte)切出し local($string, $length) = @_; if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; } return substr($string, 0, $length); } ================================================================ 宜しくお願い致します。

  • 8桁文字列を16進数バイト配列に変換

    お世話になります。 VB2005を使用しています。 温調器から温度データを引っ張るプログラムを作成しています。 8桁の文字列を16進数バイト配列に変換したいのですが、GetBytesでは10進数バイト配列に変換されてしまいます。 8桁の文字列又は10進数バイト配列を16進数バイト配列に変換する方法はないでしょうか? 文字列を1文字ずつ16進数に変換して配列に組み込んでいくしかないのでしょうか? よろしくお願い致します。

  • (1)を表示するには

    お世話になります。 ※タイトル、質問の中に(1)となってしまっていますが、マル1(マルのなかに1が入っている文字です) 以下要件を満たす関数を作りたいと思います ・文字列のINPUTに文字列をOUTPUTとする ・INPUTが60byte以上の場合は60byteに収まるようにしてOUTPUTする ・60byteできったときに最後の文字が2byte文字の場合はその文字は取り除いてOUTPUTする(この場合は60byteより短くなってもよい) 上記の問題を解決するために以下のようなメソッドを作りました。 public static String formatStatement(String realStatement) { if (realStatement == null || realStatement.getBytes().length < CUT_SIZE) { return realStatement; } byte[] b = realStatement.getBytes(); if ((int) b[CUT_SIZE - 1] < 0) { return new String(realStatement.getBytes(), 0, CUT_SIZE - 1); } return new String(realStatement.getBytes(), 0, CUT_SIZE); } この場合多くの文字は処理できるのですが、 (1)などの機種依存文字には対応できませんでした。 あとはどのような改良を加えればよいでしょうか? ※(1)などをSystem.out.printlnすると?になってしまいます。この対処方法も教えていただけるとありがたいです。 環境 WindowsXP Java1.4 開発環境はeclipse2.1

    • ベストアンサー
    • Java