3

サーバーからいくつかの txt ファイルを抽出しようとしていますが、ファイルの文字セットは UTF-8 です。私のコードはファイルをダウンロードできますが、いくつかの奇妙な文字も生成されました。

シドニーの淡水化プラント

クロムを使用して直接ダウンロードすると、次のように正しく表示されます。

シドニーの淡水化プラント

以下は私の現在のコードです:

public String getURL(String url) throws Exception
{
    StringBuffer result=new StringBuffer();
    if(StringUtils.isNotBlank(url) && url.startsWith("http"))
    {
        HttpClient client = new DefaultHttpClient();
        client.getParams().setParameter("http.protocol.content-charset", "UTF-8");
        HttpGet request = new HttpGet(url);

        // add request header
        //request.addHeader("User-Agent", "");
        //request.addHeader(Content-Type: text/html; charset=UTF-8)
        HttpResponse response = client.execute(request);

        System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
        if(response.getStatusLine().getStatusCode() == 200)
        {

            //System.out.println(response.getEntity().getContentType().getValue());
            BufferedReader rd = new BufferedReader(
                new InputStreamReader(response.getEntity().getContent(),"UTF-8"));
            //result=(EntityUtils.getContentCharSet(response.getEntity()));
            boolean flagIn = false;
            String sCurrentLine;
            while ((sCurrentLine = rd.readLine()) != null) 
            {
                //if(flagIn==false)
                //{
                //  sCurrentLine = removeUTF8BOM(sCurrentLine);
                //}

                if(flagIn)
                {
                    result.append("\n");
                }   
                 result.append(sCurrentLine);

                flagIn = true;
            }

        }
    }
    return result.toString();

}

以下は、呼び出しを試みたメソッドです。

System.out.println(former.getURL("http://photos.gcdis-india.com/png/bio/QSPNGC1002.txt"));

どの部分を修正すればよいか考えていますか?特別な http ヘッダーを提供する必要がありますか? それともリーダーが問題ですか?

4

1 に答える 1

4

わかりました、あなたの URL であなたのコードを試した後、私が知る限り、これが取り引きです。

まず第一に、UTF-8 を取得したと思い込まないでください。HTTP 応答ヘッダーにある文字エンコーディングは常に使用してください。

あなたの場合、応答ヘッダーに実際のエンコーディングがないため、デフォルトにフォールバックする必要があります。これは物事が不安定になるところです。

多くの情報源は、アポストロフィを適切にデコードする windows-1252 にフォールバックすることを推奨しています。text/html のデフォルトは iso-8859-1 ( http://www.w3.org/International/O-HTTP-charset ) ですが、 iso-8859-1 はその文字を正しくデコードしません。

windows-1252 を text/plain のデフォルトにする必要があるというハード リファレンスが見つかりません。ただし、テキスト/プレーン リクエストのほぼすべての例で、デフォルトでそのエンコーディングが使用されています。したがって、多くの場合、安全なフォールバックであるとしか言えません。

だから私は言うだろう:

  1. 応答ヘッダー (またはエンティティー) から文字セットを取得します。
  2. コンテンツ タイプがなく、コンテンツ タイプが text/plain の場合は、デフォルトで windows-1252 になります。コンテンツ タイプが text/html の場合、デフォルトは iso-8859-1 です (編集: または、さらに堅牢にしたい場合は、最初にコンテンツを us-ascii としてデコードし、html メタ タグで文字エンコーディングを探してからデコードしますそれ以外の場合は iso-8859-1)。
  3. そのコンテンツ タイプを に指定しますInputStream。utf-8 を仮定しないでください。

これまでに見つけたものはすべて、上記がほとんどのケースをカバーしていることを示しています. 決定的な情報源を探し続けます。

于 2013-08-15T03:19:00.107 に答える