• ベストアンサー

readLine()時に表示される□(四角)の意味(文字コードの問題?)

FLASHのソケットから文字列をJAVAで作った サーバで受け取りますが、 必ず一文字目に□(四角)が表れます。 これは何を意味しているのでしょうか。trim()を 使っても取れません。 (FLASHのコード) xmlsocket.send("Hello!!\r"); (JAVAのコード) str=mybufferedreader.readLine(); こんな感じです。 FLASHは、Shift-JISか、UTF-8で文字列を送って います(おそらくShift-JIS)。 なにか分かることがありましたらお願いします。

noname#10667
noname#10667
  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.4

 #1です。  \0、CやC++で使うヌル文字のようですね。  たぶん、Flashの xmlsocket.send() が一回に送る文字列の終端を表すためにヌル文字を付加しているのではないでしょうか。  もし、そうなら、Javaではヌル文字を使わないので、どうにかしなくてはいけないでしょう。  対策としては、 1.ヌル文字 \0を探して、削除していく。 2.逆に利用しちゃう。  2.がおもしろそうです。  というのも、BufferedReaderのreadLine()で文字列を受け取っていると、もし、Flashのクライアントが改行を付け忘れると、送った文字列はBufferedReaderのバッファの中に貯まってしまい次に改行が来るまで、出てきません。  まあ、忘れないようにクライアントを作ればいい話ですが、せっかく、フラッシュが有無を言わさず\0を付けてくるなら、これを区切りにしてしまった方がいいのではないでしょうか。  サンプル作ってみました。  例によってテキストファイルですが、Flashから "abc\0"、"こんにちは\0"、"def\0" とメッセージが来ていると思って、見てください。  readString()メソッドは、BufferedReaderのreadLine()みたいな感じで使います。 import java.io.*; public class NullTest {   InputStreamReader in;      public static void main(String[] args) {     try {       //Test.txtに"abc\0こんにちは\0def"を書き込む       OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream("Test.txt"), "Shift_JIS");       try {         ow.write("abc\0こんにちは\0def\0");       }       catch (IOException ex) {         ex.printStackTrace();       }       finally {         ow.close();       }              NullTest nt = new NullTest();       try {         String s;         //readString()メソッドを使って1メッセージ毎に読み込む         while ((s = nt.readString()) != null) {           System.out.println(s);         }       }       catch (IOException ex) {         ex.printStackTrace();       }       finally {         nt.in.close();       }     }     catch (IOException ex) {       ex.printStackTrace();     }   }      public NullTest() throws FileNotFoundException, UnsupportedEncodingException {     in = new InputStreamReader(new FileInputStream("Test.txt"), "Shift_JIS");   }      //ヌル文字までを一つの文字列として返すメソッド   public String readString() throws IOException {     StringBuffer sb = new StringBuffer();     int c;     while (true) {       c = in.read();       if (c > 0)         sb.append((char)c);       else         break;     }          if (sb.length() > 0)       return sb.toString();     else       return null;   } }

noname#10667
質問者

お礼

いろいろありがとうございます。 謎が解けました。 FLASHがらみなので無理かと思いましたが、 質問してみて、よかったと思います。

その他の回答 (3)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

 再び#1です。  今度は、Readerを通した場合です。  ReaderがUTF-8をUTF-16に変換してくれます。 import java.io.*; public class CharSetTest {   public static void main(String[] args) {     try {       InputStreamReader ir = new InputStreamReader(new FileInputStream("Test.txt"), "UTF-8");       try {         int c;         while ((c = ir.read()) > -1) {           System.out.print(Integer.toHexString(c) + " ");         }         System.out.println();       }       catch (IOException ex) {         System.out.println("入出力エラー");         ex.printStackTrace();       }       finally {         ir.close();       }     }     catch (FileNotFoundException ex) {       System.out.println("ファイルが見つからない");       ex.printStackTrace();     }     catch (IOException ex) {       System.out.println("ファイルを閉じることができない");       ex.printStackTrace();     }   } }  結果はこうなります。 feff 61 62 63  0xFEFF がBOMです。  0x61がa、0x62がb、0x63がcです。  UTF-16になったのでBOMは変換され2バイトになりました。  a,b,cは変わってないように見えますが、実際は1バイトから2バイトに変わっています。  私は、BOMが出てきた場合は、めんどくさいけど、取っています。 String s = br.readLine(); if (s.charAt(0) == 0xFEFF)   s = s.substring(1); System.out.println(s);  もっとスマートな方法があるのかも知れません。  参考になればよいのですが・・・。

noname#10667
質問者

お礼

最初はコードが間違っていました。 toHexString()で受けると、最初の□は無視されます。 read()で受け、16進数でコード表示すると 61 62 63 d 0 となります(16進数表示の仕方 だけでも勉強になりました)。 それと、最初の一行目には、□が出ないことが 分かりました。 したがって、恐らく、BOMではないと思います。 改行部分(\r)がd一文字であること、最後に 0(0バイト,文末?)があること、から、 改行後に、FLASH側で、なにかを送り、これが、 次のreadLine()の頭にきているのではないかと 思うのですが。どうでしょうか。 もしかしたらFLASH特有なのかもしれませんが。

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 #1です。 >[B@1d62270(UTF-8),[B@16f0be8(Shift_JIS)などと >表示されます。  配列の toString()ってなんでしたっけ?  ハッシュが出て来るんでしたっけ?  ちょっと、よくわからないので、サンプルコードを作ってみました。  Windows XP のメモ帳で「abc」と書いて、UTF-8でTest.txtとして保存しました。  これを読み込み、1byteごとに16進数で表示します。  ここでは、FileInputStreamを使っていますが、Socketから取得したInputStreamに読み替えてみてください。 import java.io.*; public class CharSetTest {   public static void main(String[] args) {     try {       FileInputStream fs = new FileInputStream("Test.txt");       try {         int c;         while ((c = fs.read()) > -1) {           System.out.print(Integer.toHexString(c) + " ");         }         System.out.println();       }       catch (IOException ex) {         System.out.println("入出力エラー");         ex.printStackTrace();       }       finally {         fs.close();       }     }     catch (FileNotFoundException ex) {       System.out.println("ファイルが見つからない");       ex.printStackTrace();     }     catch (IOException ex) {       System.out.println("ファイルを閉じることができない");       ex.printStackTrace();     }   } }  その結果が↓です。 ef bb bf 61 62 63  0xEFBBBFがUTF-8でのバイトオーダーマークです。  0x61がa、0x62がb、0x63がcです。  UTF-8では最初の128文字が1バイトで表せる分、後ろにあるバイトオーダーマークは3バイトになります。  これがReaderを通さずにした場合です。  最初の3バイトが 0xEFBBBF なら文字コードはUTF-8で最初にあるのはBOMでいいと思います。

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  Flash のソケットについてはよくわからないのですが、エンコードが「UTF-8」でお節介にも「バイト・オーダー・マーク」ってやつを付けてきているという事じゃないですかねぇ。  一文字目を調べてみてください。  0xFEFF だったら、これです。  Windows Xp のメモ帳が UTF-8 で保存すると、これを付けて来るんです。  いらないはずなのに、邪魔です。  最初の文字が 0xFEFF だったら、削っているんですけど、もっといい方法があるのかも知れません。  あっているといいのですが・・・。

参考URL:
http://www.atmarkit.co.jp/aig/01xml/bom.html
noname#10667
質問者

お礼

回答ありがとうございます。 出来る限りで、□をとり、getBytes()メソッドで、 UTF-8,Shift_JISでバイト配列を得、textareaに 表示すると、 [B@1d62270(UTF-8),[B@16f0be8(Shift_JIS)などと 表示されます。なにか分かるでしょうか。

関連するQ&A

  • 文字コードについて(どのファイルをどの文字コードにしてWeb開発を進めていくべきか)

    【疑問の背景】 文字コードについて(どのファイルをどの文字コードにしてWeb開発を進めていくべきか)   国際標準で使われているUTF-8で統一しておけば問題はないだろうと思って開発を進めていると・・・   UTF-8は「日本語が2~4バイト」で扱われるという、バイトの扱いが厄介であるため、   できればJavaでのUTF-8で開発は避けたい、だから「Shift-JIS」にしておきたいという話があがり、   各々のファイルにどの文字コードを設定すれば良いのかがわからなくなっている状態です。    いくつかの疑問がでていまして  判る範囲で構いませんので文字コード設定の判断についてのアドバイスいただけませんでしょうか? 【現在の開発文字コード】 HTMLファイル: UTF-8 JSPファイル: UTF-8 Javaファイル(servlet): UTF-8 Javaファイル(Bean): UTF-8 Javaファイル(JSPから出来たサーブレット): UTF-8 データベース: UTF-8 【設定したい今後の予定文字コード】 HTMLファイル: UTF-8 JSPファイル: UTF-8 Javaファイル(servlet): Shift-JIS Javaファイル(Bean): Shift-JIS Javaファイル(JSPから出来たサーブレット): Shift-JIS データベース: UTF-8 【疑問1】 javaファイル(servlet,Bean)をどのコードにすべきかについて  全てS-JISにした方がいいのか、UTF-8にした方がいいのかどうあるべきなのでしょうか?  (UTF-8 で 「日本語が2~4バイト」として扱われると、どういった弊害が発生するのでしょうか?) 【疑問2】 javaファイルをS-JISに変える方法について  今はサクラエディターというツールで  名前を付けて保存 → 文字コードセット「Shift-JIS」 → 保存 → ファイル名の文字コードセットの変更完了    今はエクスプローラーから直接フォルダの中にあるファイルを触っている状況なのですが、  eclipseから「ファイルの文字コードセットを変更する方法」はありますでしょうか? 【疑問3】 「Shift-JIS」に設定して開発していく必要性について  既存で「utf-8」で設定されているjavaファイルを、「Shift-JIS」に設定して開発していく必要性はあるのでしょうか? (all in one eclipse 3.4 を入れたとき、デフォルトで「utf-8」でjavaファイルが作られるつくりになっているみたいなのですが・・・)   【疑問4】 javaファイル作成時、「Shift-JIS」の形式でファイルを生成する方法について     現在、javaファイルを作成する場合「utf-8」のコードでjavaファイルが生成されるようになっています。      【自作で作成したjavaファイルの場合】    「サクラエディターを使用して、文字コードセットをShift-JISに変更すれば、ずっとShift-JISのファイルの状態」にすることができました。      しかしここで問題が出たのですが      【JSPファイルから自動生成されたjavaファイル(servlet)の場合】    「サクラエディターを使って、Shift-JISに変更した後に、JSPファイルを編集すると、また“utf-8に戻ってしまう” 状態」です。    現状としては「JavaファイルはShift-JISに統一して欲しい」という要望なので、    JSPから自動生成されたjavaファイルが "utf-8" になってしまいます。      JSPから自動生成されたjavaファイルを    "常にShift-JISに設定する" 方法はありますでしょうか?     【環境】  OS   ・WindowsXP Pro    java開発環境   ・all in one eclipse(3.4)   ・TomCat(6.0)   ・Java JRE(1.6)   ・MySQL(5.0)

    • ベストアンサー
    • Java
  • javaの文字コード変換について

    javaの文字コード変換についての質問ですが 1 shift_jis → jis83 → jis78 2 jis78 → jis83 → shift_jis と変換をかけたいと思っていますがどのようにすれ ばいいのでしょうか? String str = new String( "hogehoge", "XXX" ); でコンストラクタの2つめの引数に変換をかけたい 文字コードの指定をすればうまくいくのでしょうか? もしそうならなんと指定すればいいのでしょうか? 以上よろしくお願いします

    • ベストアンサー
    • Java
  • JAVA 文字コード変換

    こんにちは。 JAVAの文字コード変換のところで教えて頂きたい所があります。 はしご高(髙)  の文字をUTF-8からJISコードに変換してテキストファイルに書き込んでいるのですが、文字化けして"?"という文字になっています。 "髙"の文字をUTF-8からJISコードに変換の仕方のコーディング方法を教えて頂けないでしょうか。 現在下記の様に変換を行って書き込んでいます。  String str = "髙";  byte[] buf = str.substring(0, 1).getBytes("JIS0208"); OS:WindowsXP DB:Oracle10g  宜しくお願い致しますm(__)m

    • ベストアンサー
    • Java
  • BufferedReader.readline()で読み込んだ文字列の

    BufferedReader.readline()で読み込んだ文字列の長さがおかしい。 質問させてください。 BufferedReader.readline()を使用して入力した文字列の長さを表示させると、値が正しく表示されません。 例えば、「東京都千代田区」と入力した場合、長さは9と表示されます。 (東京都と入力すると長さは3と表示されます) どなたか原因をご存知ありませんでしょうか。 コードを以下に記載します。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Question_1_1 { /* * メイン関数 * @param args 起動引数 */ static public void main(String[] args) throws IOException{ InputStreamReader input = new InputStreamReader(System.in); BufferedReader buff = new BufferedReader(input); String str = ""; System.out.println("文字列入力>"); str = buff.readLine(); System.out.println("文字列長さ : " + str.length()); // ストリームを閉じる input.close(); buff.close(); } }

    • ベストアンサー
    • Java
  • Webの文字コードについて

    しばらくWeb制作から離れていまして、久しぶりなのですが、DreamweaverCS3のデフォルトの文字コードがUTF-8になっていました。 以前(MX2004の頃)はshift-jisだったと思います。 文字コードの知識もあまりなく、shift-jisにしておけば無難・・ということでそれに従っていただけなのですが、いまはUTF-8が普通なのでしょうか? UTF-8に変わった理由も知りたいです。

  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • Javaストリング文字列 の文字コード変換

    JavaでHttpRequestをつかい、 xmlを文字列で取得しDocumentオブジェクトに格納する際に、 文字コードの変換は必要でしょうか。 元のxmlはShift-Jisです。 UTF-8に変換する必要があるとどこかで見たため質問させていただきました。 また、変換が必要な場合の実装方法も教えてください。 よろしくお願いします。

  • HTMLの文字コードについて

    ウェブサイトの文字コードは何を使うのが、よいのでしょうか?現在の自分のサイトはShift_jisですが、最近のサイトはUTF-8が多いようです。Shift_jis のHTMLをUTF-8に変更する場合、HTMLにどういった変更が必要なのでしょうか?また、UTF-8に変更するメリットはなんでしょうか?

    • ベストアンサー
    • HTML
  • 文字コードが変わってしまう

    Webページ作成関連の市販のテキストについているサンプルコードを自分のマシンにコピーして勉強しています。WindowsXPとWindows7を使っています。 たとえば、【今日問題なく使った】のに、翌日同じHTMLファイルのソースを見たら、文字コードが矢印に変わってしまっています。 改行コード変換ソフトで変換して、また元に戻して作業をしました。 翌日、他の部屋のマシン(WinXP)でそのファイルを開いたら、また文字コードが矢印に変わっていました。 詳しいことはわからないレベルですが、状況だけ書いてみました。 文字コードが変わってしまうタイミングってあるのでしょうか。関係ないかもしれませんが、書籍についてきたサンプルファイルの文字コードはUTF-8なので、文字コード変換ソフトでShift_JISに変更しました(なぜShift_JISにしたかは、特に意味はありません。UTF8がいいというのは聞いていますが、とりあえずShift_JISでやっています)。 難しい理論は理解できないと思いますが、どうしてそうなるかを教えていただける方がいたらお願いします。

  • 文字コードについて

    よろしくお願いします。 ホームページを作成しました。というより現在作成中です。 htmlの記述を確認しようと以下のサイト様より文法チェツクをしたところ、以下のように表示されました。 line 5: 指定されている文字コードセットは `Shift_JIS` ですが、実際のコードは UTF-8 のようです。 私は、文字コードの部分はShift_JISにしておきたいのですが、 このようなエラーはどのように、どの部分を変更すれば良いのでしょうか? 全く分からずに困っております。 どなた様か、ご指導の程よろしくお願いします

    • ベストアンサー
    • HTML

専門家に質問してみよう