A 回答 (11件中1~10件)
- 最新から表示
- 回答順に表示
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");
};
}
No.10
- 回答日時:
おそくなりましたが返信いたします。
#8で示されたもので
期待された結果がえることができました。
ありがとうございました。
この質問のオーナーではないのですが、
大変参考になりました。
No.9
- 回答日時:
<<<<<<訂正>>>>>>
誤)
-----------*-------------------
Nが4の時にNo5で示されたパターンに
ついて
正)
-----------*-------------------
Nが4の時にNo7で示されたパターンに
ついて
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("#######################################################");
}
}
}
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= "ああ"
です。
で、いろいろ考えて前質問のような形に行き着いた次第です。
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) + "]");
}
}
No.5
- 回答日時:
#3です。
<引用>
ただ、「指定したバイト数目が2バイト文字」
は変ですね。
だって指定したバイトはバイトなんだから1バイトでしょ。
正しくは「指定した文字数目が2バイト文字」
ではないでしょうか。
</引用>
いま思うととてもおかしな日本語でした。
以下のように訂正いたします。
指定したバイト数目が2バイト文字の先頭のバイトではない
という表現にします。
これは
aaaあb
という文字列があった場合に
4byte目は"あ"という文字の先頭バイトが入ると思います。
この場合はaaaというようにしたかったのです。
byte単位で文字列をきった場合に
途中で切れてしまう場合には一個前の文字までにする
という処理がしたかったです。
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;
}
以上
No.3
- 回答日時:
お世話になります。
前回この下の問題で質問をしものです。
前回の質問の背景は
2バイト文字の判定をするときに
2バイト文字であるならば必ず一バイト目がマイナスになるかどうかを確証を得るために質問いたしました。
2バイト文字の判定となると
皆様のご指摘の通りで
getBytes().length == 2
で行うのが自然と思われます。
しかし指定したバイト数目が2バイト文字かどうかを
うまく判定するにはどうしたらよいものかということで
前回の質問をした次第です。
※指定した文字数目が2バイトかどうかの判定は
getBytes().lengthでも自然な形で判定可能と思われます。
質問の回答ではありませんが、
補足説明をこの場を借りてさせていただきました。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) 指定文字を太字にするVBAを別シートのセルを指定する構文(改良について) 6 2022/08/27 22:11
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Perl perlについての質問 2 2022/10/17 15:25
- 統計学 生物統計学の質問 7 2022/05/17 13:59
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
VBAでShift-JISのURLエンコード
-
memcmp バイナリデータの比較方法
-
機種依存文字をチェックしたい。
-
ピクセル,dpiから容量(バイト...
-
文字コードにお詳しい方、教え...
-
バイナリとBCDコード
-
char str[256]の256の意味は?
-
PHPで文字列の一部を省略する時...
-
ソケット通信の受信サイズ
-
URLは最高何文字まで可能なので...
-
バイト列とバイナリ列の違いが...
-
MIDIにおいて ステータスバイト...
-
EUCのダブルバイト文字の判定
-
バイナリファイルのデータから...
-
ワイド文字のバイト数が取得で...
-
1バイト文字から2バイト文字に変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
ピクセル,dpiから容量(バイト...
-
C++ Builderで文字列をバイトに...
-
Javaで日本語1文字のバイト数
-
ビットスワップとバイトスワッ...
-
SQLで1バイト、2バイト混在...
-
バイナリとBCDコード
-
URLは最高何文字まで可能なので...
-
機種依存文字をチェックしたい。
-
VBAでShift-JISのURLエンコード
-
COBOL PICTUREで X,S,Vの意味
-
memcmp バイナリデータの比較方法
-
pythonでバイナリデータを配列...
-
64bit対応
-
3バイト文字(UTF-8)をprintfで...
おすすめ情報