これが怖いの自分だけ?というものありますか?

A 回答 (11件中1~10件)

 文字列中の文字の特定のエンコーディング形式でのバイト数は、


文字列を一文字ずつの文字列に分解してそれをバイト変換してその長さを調べればよいと思います。
また、文字のバイト数はエンコーディング形式によっても変わります。

下の例は、指定された文字列のそれぞれの文字のバイト数を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");

};

}
    • good
    • 0

おそくなりましたが返信いたします。



#8で示されたもので
期待された結果がえることができました。

ありがとうございました。

この質問のオーナーではないのですが、
大変参考になりました。
    • good
    • 0

<<<<<<訂正>>>>>>



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


正)
-----------*-------------------
Nが4の時にNo7で示されたパターンに
ついて
    • good
    • 0

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("#######################################################");
}
}
}
    • good
    • 0

#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= "ああ"

です。

で、いろいろ考えて前質問のような形に行き着いた次第です。
    • good
    • 0

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) + "]");
}
}
    • good
    • 0

#3です。



<引用>
ただ、「指定したバイト数目が2バイト文字」
は変ですね。
だって指定したバイトはバイトなんだから1バイトでしょ。
正しくは「指定した文字数目が2バイト文字」
ではないでしょうか。
</引用>

いま思うととてもおかしな日本語でした。
以下のように訂正いたします。

指定したバイト数目が2バイト文字の先頭のバイトではない

という表現にします。

これは
aaaあb
という文字列があった場合に
4byte目は"あ"という文字の先頭バイトが入ると思います。
この場合はaaaというようにしたかったのです。

byte単位で文字列をきった場合に
途中で切れてしまう場合には一個前の文字までにする
という処理がしたかったです。
    • good
    • 0

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;
}


以上
    • good
    • 0

お世話になります。


前回この下の問題で質問をしものです。

前回の質問の背景は
2バイト文字の判定をするときに
2バイト文字であるならば必ず一バイト目がマイナスになるかどうかを確証を得るために質問いたしました。

2バイト文字の判定となると
皆様のご指摘の通りで
getBytes().length == 2
で行うのが自然と思われます。

しかし指定したバイト数目が2バイト文字かどうかを
うまく判定するにはどうしたらよいものかということで
前回の質問をした次第です。
※指定した文字数目が2バイトかどうかの判定は
getBytes().lengthでも自然な形で判定可能と思われます。

質問の回答ではありませんが、
補足説明をこの場を借りてさせていただきました。
    • good
    • 0

 文字列中に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;
}
}
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報