Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

URLからのデータ取得で文字化け

以下のコードでUTF-8のファイルを取得すると、文字化けしてしまいます。
取得したStringをファイル・コンソールに出力してみましたが同様の文字化けをしていました。
全角のコロン「:」などが化けます。(大部分は正常に表示される)
実行環境はWindowsのアプレットビューワーです。

解決方法が分かる方教えてもらえないでしょうか。
よろしくお願いします。

protected String loadURL(URL urlFile) throws AccessControlException {
        final String CRLF = System.getProperty("line.separator");
        String strData = "";
        try {
            BufferedReader buff;
            buff = new BufferedReader(new InputStreamReader(urlFile.openStream()));
            String str = null;
            while (true) {
                str = buff.readLine();
                if (str == null) {
                    break;
                }
                strData += str;
                strData += CRLF;
            }
        } catch (IOException e) {
            System.out.println(e.toString() + urlFile);
        }        
        return strData;
    }

24

回答

82469

閲覧

24件の回答

評価

0

さらに検証していたところ、
全角コロン「:」が含まれたStringはreplaceAllも効かないことが分かりました。
全角コロンがなければ同じコードで置換できました。
と言うのは文字化けする記号を置換して対応しようと思ったのですが、
やるならByte配列にして文字コードを調べて数値比較でやるとかしないといけないんですかね。

他の方がUTF-8の文字列をどう扱っているか知りたいです。

評価

0

ェ・)つInputStreamReaderのコンストラクタ

評価

0

InputStreamReaderによるcharset指定も試しましたが解決しませんでした。
UTF-8のファイルを読み込みUTF-8で表示する目的ですのでエンコード変換は不要なのですが、
試しにInputStreamReaderにUTF-8を指定してみると一部のみが化けていたのが半角以外全て化ける結果となりました。
(恐らく全角コロンを含んだUTF-8文字列にさらにUTF-8への変換をかけると壊れる)

大部分は化けずに、全角コロンのみが化けるので
文字コードの指定ミスなどではないと思っています。
皆様の環境では全角コロンを含んだUTF-8文字列のコンソール・ファイルなどへの出力は正しく出来ますでしょうか?

評価

0

>文字コードの指定ミスなどではないと思っています。

みんなそういうんだ。

俺なら、元々のファイルの異常を疑うけどな。
Javaのコードじゃなくて、テキストエディタとかnkfで試してみては。
もちろん、エンコーディングは明示的に指定する。

評価

0

元のファイルは秀丸、Notepad++の2通りの手段にて文字化けが全くないUTF-8ファイルであることを確認しています。

皆様の環境では全角コロンを含んだUTF-8文字列のコンソール・ファイルなどへの出力は正しく出来ますでしょうか?

評価

0

見たことも聞いたことも無い現象。
元ファイル自体が破壊されている可能性が高いかと。
URL("file:...")で化けていないローカルのファイルを渡して確認してみては?

評価

0

>皆様の環境では全角コロンを含んだUTF-8文字列のコンソール・ファイルなどへの出力は正しく出来ますでしょうか?

できましたよぉ。

評価

0

Javaアプレットの開発中ですのでローカルのファイルで試しています。
対象ファイルをバイナリで読み込み、別ファイルへ出力すると文字化けを起こさずにコピーが出来ます。
ただし読み込んだバイナリを一度でもString型にすると文字化けが起こり、コンソール・ファイルいずれへ出力しても文字化けしています。

>コロさん
良ければコードを教えてもらえないでしょうか?

評価

0

一つ言い忘れてたので齟齬が発生したかもしれません。
バイナリで読み込み、そのまま書き込む場合は私も文字化けは発生しません。
ただし内部で一度でもString型にした場合、
元ファイルと同じUTF-8のまま扱っていても文字化けします。

評価

0

システムプロパティを確認してみては?

Properties p = System.getProperties();
for (Entry<Object, Object> entry : p.entrySet()) {
    System.out.println(entry.getKey() + ":" + entry.getValue());
}

評価

0

>ただし内部で一度でもString型にした場合、

このときのエンコーディング指定が正しくないってことでは。

評価

0

システムプロパティを見直して以下を試しましたが解決しませんでした。
file.encoding = MS932 > UTF-8

以下を実行するとMS932と出力されるのが非常に怪しいのですが、この設定の変更がJDKのバージョンによって出来たり出来なかったりするという情報がありました。
出来る場合はコンパイルオプションの-Dfile.encoding=UTF-8でいいようです。
System.out.println(sun.io.Converters.getDefaultEncodingName());
http://sora.ws/iroiro/2006/12/05_0225.html

評価

0

>良ければコードを教えてもらえないでしょうか?

つはい、どうぞ。
--------------------

public class SampleUni {
    public static void main(String[] args) {

        BufferedReader buff;
        try {
            buff = new BufferedReader(new InputStreamReader(
                    new FileInputStream(new File("sampleUni.txt")), "UTF-8"));
            System.out.println(buff.readLine());//OK
        } catch (IOException e) {
            e.printStackTrace();
        }

        SampleUni uni = new SampleUni();
        try {
            String str = uni.loadURL(new URL("file:"
                    + new File("sampleUni.txt").getAbsolutePath()));
            System.out.println(str);//これもOK
        } catch (AccessControlException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    protected String loadURL(URL urlFile) throws AccessControlException {
        final String CRLF = System.getProperty("line.separator");
        String strData = "";
        try {
            BufferedReader buff;
            buff = new BufferedReader(new InputStreamReader(
                    urlFile.openStream(), "UTF-8"));
            String str = null;
            while (true) {
                str = buff.readLine();
                if (str == null) {
                    break;
                }
                strData += str;
                strData += CRLF;
            }
        } catch (IOException e) {
            System.out.println(e.toString() + urlFile);
        }
        return strData;
    }
}
--------------------

評価

0

関係あるかどうかわからないけど、
FireFoxで表示するとその現象が起きることもあるみたいですね

評価

0

俺は、システムプロパティがどう絡むのか、よくわからん。

デフォルトで使用される設定以上でも以下でもないと
考えているんだが、違うの?
扱うファイルのエンコーディングごときに合わせて、
ころころ変更するようなものでも無し。

俺としては、上にも書いたが、
     
>ただし内部で一度でもString型にした場合、

この箇所の具体的なコードが欲しい。

評価

0

>UTF-8のファイルを読み込みUTF-8で表示する目的ですのでエンコード変換は不要
どこにどうやって「表示」しようとしてるかによるが、JavaのStringはUTF-16、Windowsのデフォルトのread/writeがShift_JISだから、どれもUTF-8とは違うんだ。
既出のようにReaderに文字コードを指定してやれば、ファイルをUTF-8として読み込み、さらにUTF-16に変換してくれる。


が、今回の現象はJREの(修正済み)マイナー不具合か、「表示」に使ってるフォントの問題かも知れない。
一度Stringにしたものを、「表示」せずに別のファイルに書き出したらどうなる?

評価

0

それと、Webから何かコードを通して落とすなら、ファイル自体のエンコードかどうかは分からんよ。
対象の文字コードが何かは確実に意識する必要があり、Readerにはその文字コードを指定する方が良い。

評価

0

明示的にエンコードを指定したものをファイルへ出力したところ、
テキストを介しても正常に出来ました。
FileOutputStream fout = new FileOutputStream("C:\\test.test");
byte[] test = "あ:い:う:え:お".getBytes("UTF-8");
fout.write(test);

しかしこの正常に出力できたStringも、
コンソールへ出力すると文字化けします。
この際の文字化けは[B@1ac3c08など完全に意味不明なもので、文字数が極端に減っています。
(より文字化けが酷くなる方が正常だったので勘違いしていました)

私の環境では以下のコードが全て文字化けします。
            System.out.println(new String("あいうえお".getBytes("Shift_JIS"),"Shift_JIS"));
            System.out.println(new String("あいうえお".getBytes()));
            System.out.println(new String("あいうえお".getBytes("UTF-8"),"Shift_JIS"));
            System.out.println(new String("あいうえお".getBytes("UTF-8"),"UTF-8"));
            System.out.println(new String("あいうえお".getBytes("MS932"),"MS932"));
            System.out.println(new String("あいうえお".getBytes("UTF-8"),"MS932"));

コンソールは使えませんが、とりあえず進められそうです。
多大な助言ありがとうございました。

評価

0

>私の環境では以下のコードが全て文字化けします。
3つめと6つめは正常としても…
1,2,4,5は私の環境では正常に表示されます。

すると、私の提示したコードも、コンソールでは文字化けするって事ですかね?
色々設定したオプションなどを元に戻しても直らないのですかね?

評価

0

Window→Preferences→General→Appearance→Colors and Fonts
右側のツリーのDebug→Console Fonts
だったかな。


そういえば自分の使ってるPCで、MS ゴシックを23pt以上で表示すると派手に文字化けするのが2台あったな…(22pt以下や他のフォントは化けない)。
JRE自体になんらかの問題がある可能性はある。
向こうさんの作ったものだから。

評価

0

>しかしこの正常に出力できたStringも、
>コンソールへ出力すると文字化けします。
>この際の文字化けは[B@1ac3c08など完全に意味不明なもので、

それは意味不明なものじゃない。
Cで言うところのポインタアドレス。

バイト配列をそのままコンソール出力とかいうまずいコード書いてい
るんじゃないのかな?

評価

0

>バイト配列をそのままコンソール出力とかいうまずいコード書いてい
>るんじゃないのかな?

>System.out.println(new String("あいうえお".getBytes()));

「ハッシュコード」と言うべきか「ポインタ」と言うべきか(この場合どっちでもいいけど)。

評価

0

↑上の、new String()を見落としてた。失礼。

評価

0

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6856390

これ関係ある?

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。