11

http://api.freebase.com/api/trans/raw/m/0h47からデータを取得しようとしています

あなたがテキストで見ることができるように、このような歌があります: /ælˈdʒɪəriə/

ページからソースを取得しようとすると、úなどの歌のテキストが表示されます。

これまでのところ、次のコードで試しました。

urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");

私は何が間違っているのですか?

私のコード全体:

URL url = null;
URLConnection urlConn = null;
DataInputStream input = null;
try {
url = new URL("http://api.freebase.com/api/trans/raw/m/0h47");
} catch (MalformedURLException e) {e.printStackTrace();}

try {
    urlConn = url.openConnection(); 
} catch (IOException e) { e.printStackTrace(); }
urlConn.setRequestProperty("Accept-Charset", "UTF-8");
urlConn.setRequestProperty("Content-Type", "text/plain; charset=utf-8");

urlConn.setDoInput(true);
urlConn.setUseCaches(false);

StringBuffer strBseznam = new StringBuffer();
if (strBseznam.length() > 0)
    strBseznam.deleteCharAt(strBseznam.length() - 1);

try {
    input = new DataInputStream(urlConn.getInputStream()); 
} catch (IOException e) { e.printStackTrace(); }
String str = "";
StringBuffer strB = new StringBuffer();
strB.setLength(0);
try {
    while (null != ((str = input.readLine()))) 
    {
        strB.append(str); 
    }
    input.close();
} catch (IOException e) { e.printStackTrace(); }
4

3 に答える 3

13

HTML ページは UTF-8 で、アラビア文字などを使用できます。ただし、Unicode 127 を超えるこれらの文字は、 のような数値エンティティとしてエンコードされますú。Accept-Encoding は役に立たず、UTF-8 としてロードすることは完全に正しいです。

エンティティを自分でデコードする必要があります。何かのようなもの:

String decodeNumericEntities(String s) {
    StringBuffer sb = new StringBuffer();
    Matcher m = Pattern.compile("\\&#(\\d+);").matcher(s);
    while (m.find()) {
        int uc = Integer.parseInt(m.group(1));
        m.appendReplacement(sb, "");
        sb.appendCodepoint(uc);
    }
    m.appendTail(sb);
    return sb.toString();
}

ちなみに、これらのエンティティは、処理された HTML フォームから派生する可能性があるため、Web アプリの編集側で発生します。


問題のコードの後:

テキストの DataInputStream を (Buffered)Reader に置き換えました。InputStreams は、バイナリ データ (バイト) を読み取ります。リーダーのテキスト、文字列。InputStreamReader は、パラメータとして InputStream とエンコーディングを持ち、Reader を返します。

try {
    BufferedReader input = new BufferedReader(
            new InputStreamReader(urlConn.getInputStream(), "UTF-8")); 
    StringBuilder strB = new StringBuilder();
    String str;
    while (null != (str = input.readLine())) {
        strB.append(str).append("\r\n"); 
    }
    input.close();
} catch (IOException e) {
    e.printStackTrace();
}
于 2012-01-20T00:54:54.140 に答える
2

問題は、ストリームから読んでいるときだと思います。呼び出す代わりに でreadUTFメソッドを呼び出すか、または、私が行うことは、 を作成してエンコーディングを設定することです。その後、行ごとに読み取ることができます(これは既存の try/catch 内にあります)。DataInputStreamreadLineInputStreamReaderBufferedReader

Charset charset = Charset.forName("UTF8");
InputStreamReader stream = new InputStreamReader(urlConn.getInputStream(), charset);
BufferedReader reader = new BufferedReader(stream);
StringBuffer responseBuffer = new StringBuffer();

String read = "";
while ((read = reader.readLine()) != null) {
    responseBuffer.append(read);
}
于 2012-01-20T00:35:39.563 に答える