Bir web sayfasından yakalanan bir JSON dizisiyle garip karakter kodlaması sorunları yaşıyorum. Sunucu bu kafayla geri gönderiyor:Android Java UTF-8 HttpClient Sorun
Content-Type text/javascript; charset = UTF-8
Ayrıca ben Firefox'ta JSON çıktı veya herhangi bir tarayıcıda bakabilirsiniz ve Unicode karakterleri düzgün görüntülemek. Yanıt bazen aksan sembolleri ve benzeri başka bir dilde kelimeleri içerecektir. Ancak, indirdiğimde ve Java'da bir dizeye koyduğumda bu garip soru işaretlerini alıyorum. Gördüğünüz gibi, ben InputStreamReader üzerinde UTF-8 belirterek ediyorum ama Toast üzerinden geri JSON metnini görüntülemek her zaman garip soru işaretleri var
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "utf-8");
params.setBooleanParameter("http.protocol.expect-continue", false);
HttpClient httpclient = new DefaultHttpClient(params);
HttpGet httpget = new HttpGet("http://www.example.com/json_array.php");
HttpResponse response;
try {
response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode() == 200){
// Connection was established. Get the content.
HttpEntity entity = response.getEntity();
// If the response does not enclose an entity, there is no need
// to worry about connection release
if (entity != null) {
// A Simple JSON Response Read
InputStream instream = entity.getContent();
String jsonText = convertStreamToString(instream);
Toast.makeText(getApplicationContext(), "Response: "+jsonText, Toast.LENGTH_LONG).show();
}
}
} catch (MalformedURLException e) {
Toast.makeText(getApplicationContext(), "ERROR: Malformed URL - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "ERROR: IO Exception - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "ERROR: JSON - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
private static String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the BufferedReader.readLine()
* method. We iterate until the BufferedReader return null which means
* there's no more data to read. Each line will appended to a StringBuilder
* and returned as String.
*/
BufferedReader reader;
try {
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
StringBuilder sb = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
: İşte benim kodudur. Ben InputStream yerine bir byte [] göndermek gerektiğini düşünüyorum?
Yardımlarınız için şimdiden teşekkür ederiz. Arhimed cevabı @
if (entity != null) {
// A Simple JSON Response Read
// InputStream instream = entity.getContent();
// String jsonText = convertStreamToString(instream);
String jsonText = EntityUtils.toString(entity, HTTP.UTF_8);
// ... toast code here
}
Teşekkür:
SonraInputStreamReader
oluşturmak için çıkarılan charset kullanın. Değişikliklerinizi ekledim ve EntityUtils için ekstra Apache öğelerini aldım ancak şimdi uygulama beklenmedik şekilde EntityUtils.toString satırında sonlandırılıyor. program derler ve çalışır, ancak toString'i çağırmadan önce varlığa bir şeyler yapmam gerekir mi? –boşver. Ben bir aptalım ve benim URL'mle bir şeyleri karıştırdım. İşe yarıyor! Karakterler doğru şekilde işlenir! –
@Michael: Bu cevap çok iyi ve eğer soruyu sorsaydım bunu kabul ederdim. – SK9