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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列にnullを代入すると、null...
-
Eclipse 動的プロジェクトで404...
-
次のhtml・cssでspan内の文字を...
-
マイクラでPythonのプログラミ...
-
「main メソッドを持つクラスが...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
jdbcでinsert,delete,createをe...
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
-
ショートカットキーについて
-
list の空は [] ってあわらすのに
-
あんまりお料理しないのに台所...
-
質問です。 配列が100以上の場...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
C++ Builderで文字列をバイトに...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
「1TB」のHDDに日本語は何字入...
-
GetWindowTextでアドレスバーか...
-
ピクセル,dpiから容量(バイト...
-
【VB2005】テキストボックス内...
-
URLは最高何文字まで可能なので...
-
64bit対応
-
UCS-2の一覧表が欲しい
-
VBAでUnicodeしか存在しない文...
-
SQLで1バイト、2バイト混在...
-
ビットスワップとバイトスワッ...
-
CRC計算方法
おすすめ情報