(1)を表示するには

このQ&Aのポイント
  • 文字列のINPUTに文字列をOUTPUTとする
  • INPUTが60byte以上の場合は60byteに収まるようにしてOUTPUTする
  • 60byteできったときに最後の文字が2byte文字の場合はその文字は取り除いてOUTPUTする
回答を見る
  • ベストアンサー

(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
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

win2000+J2SDK1.4.0で試しましたが、 私の環境では特にMS932と指定しなくても DOSプロンプトで表示できました。 class testmain{ public static void main(String[] args) { System.out.println(formatStatement("0123456789(1)012345678901234567890123456789012345(1)6789012(1)345678901234567890123456789012345678901234567890123456789012345678901234567890123456789")); } public static String formatStatement(String realStatement) { if (realStatement == null || realStatement.getBytes().length < 60) { return realStatement; } byte[] b = realStatement.getBytes(); if ((int) b[60 - 1] < 0) { return new String(realStatement.getBytes(), 0, 60 - 1); } return new String(realStatement.getBytes(), 0, 60); } } eclipse2は使ったことないので設定方法はわかりませんが、ソースの保存形式は SJISになっているのでしょうか? これがUTF8やEUCになっている可能性があると思います。 またコンパイル時に-encodingを明示的にsjisを指定してみてください。 それでも駄目なら、これ以上は私には分かりません。

chi-kon
質問者

お礼

アドバイスありがとうございます。 ご指摘いただいたとおりでした。 eclipseの設定をUTF-8としていたので 上記の現象になっていた模様です。 ソースの保存形式をMS932としておこなったところ 期待通りの動きを致しました。 ありがとうございました。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

○の中に1、それは機種依存文字ですね。 同じS-JisでもWindowsのみで定義されています(Mac等では表示できません) 他にも(株)などもそうです。 UNICODEではコード自体存在しません。 ちょっと検索したのですが エンコードをMS932と指定すれば表示できるかもしれません。

参考URL:
http://www.ioctv.zaq.ne.jp/kreuz/java/myref/string.html
chi-kon
質問者

補足

アドバイスありがとうございます。 コードを以下のように変更いたしましたが、 問題解決には至りませんでした。 私が文字コード自体の理解が浅いため 修正方法が誤っているのかもしれません。 byte[] b = null; try { b = realStatement.getBytes("MS932"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }

関連するQ&A

  • バイト配列 unicode

    java初心者です。 以下のソースコードの 「new String(strVal.getBytes("ISO-8859-1"),"JISAutoDetect」 の部分の意味が分からなくこまっています。 <%@ page import="java.io.*" %> <%! public String strEncode(String strVal) throws UnsupportedEncodeingExcception{ if(strVal==null){ return null; }else{ return new String(strVal.getBytes("ISO-8859-1"),"JISAutoDetect")); } } %> そもそも 「バイト配列とは何か」 「なんで必要なのか?」 など、わかりやすく説明していただけると幸いです。

    • ベストアンサー
    • Java
  • 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でも構いませんが教えてください。 以上、よろしくお願いします。

  • 文字列の長さ

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

  • 携帯絵文字の掲示板について

    いつも感謝してますが、また質問してしまいました。 本当に情けないです。。。。 現在携帯サイトを構築しています。 PHP×携帯デベロッパーズバイブルって本の掲示板の一部分なんですが、以下の箇所(具体的には正規表現の箇所)でエラーがでます。 またこの掲示板のスクリプトなんですが、この本自体のサンプルコードはどこかに落ちてないのでしょうか? できれば、それが一番早いんですが。。。。 /* * 絵文字の入った入力文字列を内部絵文字の入った文字列に変換する(SoftBankの3GC) * * @param integer $data 入力された文字列 * @return string 内部絵文字に変換された文字列 */ function emoji_text_input_softbank_utf8($data){ //入力文字が空の場合 if(empty($data)){ return $data; } $old_data=$data; $new_data=''; while(1){ if(strlen($old_data)==0){ break; } $moji=mb_substr($old_data,0,1,'UTF-8'); $old_data=mb_substr($old_data,1,mb_strlen($old_data),'UTF-8'); //内部絵文字に変換する。 $output=preg_replace_callback('/\xEE([\x80\x81\x84\x85\x88\x89\x8C\x8D\x90\x91\x94][\x80-\xBF])/','emoji_input',$moji); $new_data.=$output; } return $new_data; }

    • ベストアンサー
    • PHP
  • ジャヴァ基礎問題

    import java.io.*; public class Email11 { public static void main(String[] argv) throws Exception { String input = "fileContainingEmails.txt"; String output = "copyPasteMyEmails.txt"; BufferedReader cin; cin = new BufferedReader(new InputStreamReader(System.in)); String userInput; System.out.println("Enter input file name [default name: fileContainingEmails.txt]"); userInput = cin.readLine(); if (userInput.equals("")) userInput = input; String name; if (userInput.equals("")) name = output; else name = input; String userOutput; System.out.println("Enter output file name [default name: " + name + " ]"); userOutput = cin.readLine(); if (userOutput.equals("")) userOutput = name; System.out.println("Input FIle : " + userInput); System.out.println("Output FIle : " + userOutput); } } このプログラムでユーザーがインプットファイル名を入力した場合そのファイル名がアウトプットファイルのデフォルトになるという形にしたいのですがどこが間違っていますか? ユーザーがデフォルトのインプットファイル名を選んだ場合デフォルトのアウトプットファイル名が適応されます。

  • char型からのバイト数取得

    文字列から1文字ずつバイト数を取得(判定)したいのですが、 char型の文字のバイト数を取得するスマートな方法はありますか? 今考えているのは以下のようなコードです。 String str ="あA" for(int i=0; i < str.length(); i++) { char ch = str.charAt(i); StringBuffer SB = new StringBuffer(); SB.append(c); if(SB.toString().getBytes.length == 1) { //1バイトの処理 } else { //2バイトの処理 } }

    • ベストアンサー
    • Java
  • エンコード指定でコンパイルエラー

    以下のソースで、UnsupportedEncodingExceptionと、 コンパイルエラーが発生します。 byte[] sjisBytes; // 適当なバイト列を入れる String string = new String(sjisBytes, "Shift_JIS"); // エラー String s; // 適当な文字列を入れる byte[] b = s.getBytes( "Shift_JIS" ); // エラー サポートされている他のエンコーディング(UTF-8など)を入れても、 同じエラーになります。 原因がわかる方いらっしゃいますでしょうか?

    • ベストアンサー
    • Java
  • 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数のカウント方法で「環境に依存しない」はあるのでしょうか? ご教授願います。

  • Stringオブジェクトの文字コードの変換

    NewString = new String(b.getBytes("iso-8859-1"),"Shift_JIS"); でShift-Jisに変換できるとありましたが、どうも出力の 日本語部分が3Fになってしまってうまくいきません。 テスト用に以下のコードを作ってみました。 import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; import java.io.FileOutputStream; public class Test { public static void main(String[] args) { try{ String regex_title; regex_title = "制限をしている場合"; System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); regex_title = "制限をしている場合"; regex_title = getUTF8(regex_title); System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); regex_title = "制限をしている場合"; regex_title = getShiftJIS(regex_title); System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); FileOutputStream fs = new FileOutputStream("./test.txt"); fs.write(regex_title.getBytes()); fs.close(); }catch(Exception ex){ } } public static String getHexString(byte[] b){ String buff=""; try{ for(int i=0;i<b.length;i++) buff += String.format("\\x%02x", b[i]); }catch(Exception ex){ } return buff; } public static String getUTF8(String b){ try { //UTF-8へ変換 return new String(b.getBytes(), "UTF-8"); } catch (Exception e) { e.printStackTrace(); return b; } } public static String getShiftJIS(String b){ try { //UTF-8へ変換 return new String(b.getBytes(),"Shift_JIS"); } catch (Exception e) { e.printStackTrace(); return b; } } // @Override } //////////////////////////////////////////////////////////// 1. System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); の部分の出力をみると3Fに変換されています。 regex_title.getBytes("iso-8859-1")の時点で3Fな事がわかります。 何故でしょうか? 私がやりたい事はStringの内部のコードをUTF8にする事です。 NewString = new String(b.getBytes("iso-8859-1"),"UTF-8"); では、出来ていないようでした。 2. また、以下のコードを実行するとtest.txt test2.txtともに 文字コードがShiftJisで出力されるのはなぜでしょうか? 変換を行わなければ内部処理形式のUnicodeで出力されるの ではないのでしょうか? regex_title = "制限をしている場合"; FileOutputStream fs = new FileOutputStream("./test.txt"); fs.write(regex_title.getBytes()); fs.close(); File file = new File("./test2.txt"); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write(regex_title); bw.close(); 上はgetBytes()が変換してるのでしょうか? 下はBufferedWriterかFileWriterが変換してる? ではString内部のByteをそのまま出力するにはどうしたら・・・。

    • ベストアンサー
    • Java

専門家に質問してみよう