2014-06-05 8 views
9

मैं क्रम में निम्न कोड स्निपेट का उपयोग किया है अब तक भेजने और JSON तार प्राप्त करने के लिए:भेजा जा रहा है UTF-8 स्ट्रिंग का उपयोग HttpURLConnection

static private String sendJson(String json,String url){ 
    HttpClient httpClient = new DefaultHttpClient(); 
    String responseString = ""; 
    try { 
     HttpPost request = new HttpPost(url); 
     StringEntity params =new StringEntity(json, "UTF-8"); 
     request.addHeader("content-type", "application/json"); 
     request.setEntity(params); 
     HttpResponse response = httpClient.execute(request); 
     HttpEntity entity = response.getEntity(); 
     responseString = EntityUtils.toString(entity, "UTF-8"); 

    }catch (Exception ex) { 
     ex.printStackTrace(); 
     // handle exception here 
    } finally { 
     httpClient.getConnectionManager().shutdown(); 
    } 
    return responseString; 
} 

कोड के ऊपर का पूर्ण काम किया है, भले ही json स्ट्रिंग निहित UTF-8 चार्स, और सब कुछ ठीक काम किया।

कई कारणों से मुझे HTTP पोस्ट अनुरोध भेजने के तरीके को बदलना पड़ा और इसके बजाय Apache's HttpClient के HttpURLConnection का उपयोग करना पड़ा। यहाँ मेरी कोड है:

static private String sendJson(String json,String url){ 
    String responseString = ""; 
    try { 
     URL m_url = new URL(url); 
     HttpURLConnection conn = (HttpURLConnection)m_url.openConnection(); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     conn.setUseCaches(false); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("content-type", "application/json"); 
     DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream()); 
     outputStream.writeBytes(json); 
     outputStream.flush(); 
     outputStream.close(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     while ((line = br.readLine()) != null) { 
      sb.append(line+"\n"); 
     } 
     br.close(); 
     responseString = sb.toString(); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return responseString; 
} 

इस कोड को सामान्य अंग्रेजी अक्षर के लिए अच्छी तरह से काम करता है, लेकिन json स्ट्रिंग में UTF-8 वर्णों का समर्थन करते प्रतीत नहीं होता है, क्योंकि यह हर बार विफल रहता है। (सर्वर पर जेसन भेजते समय, सर्वर यह कहता है कि utf8 एक निश्चित बाइट को डीकोड नहीं कर सकता है, लेकिन सर्वर से utf8 json प्राप्त करने पर मुझे लगता है कि यह काम करता है क्योंकि मैं विशेष वर्णों को देखने में कामयाब हूं)।

सर्वर बिल्कुल नहीं बदला और पिछले कोड के साथ ठीक काम किया, इसलिए समस्या इस नए कोड स्निपेट पर 100% है।

कोई विचार है कि जेसन स्ट्रिंग को कैसे ठीक किया जाए, तो यह यूटीएफ 8 का समर्थन करेगा? धन्यवाद

उत्तर

22

मुझे लगता है कि समस्या इस हिस्से में है:

DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream()); 
outputStream.writeBytes(json); 
outputStream.flush(); 
outputStream.close(); 

इसके बजाय ऐसा करने का आपको UTF-8
के रूप में json सांकेतिक शब्दों में बदलना और उन बाइट्स जो UTF-8 एन्कोडिंग का प्रतिनिधित्व भेजने की जरूरत है।

उपयोग करने का प्रयास करें:

Charset.forName("UTF-8").encode(json) 

देखें:

Charset.encode

एक भी सरल दृष्टिकोण का उपयोग करने के लिए है जैसे BufferedWriter
OutputStreamWriter लपेटना। OutputStreamWriter अपने स्वयं के एन्कोडिंग
के बारे में जानता है और इसलिए यह आपके लिए काम करेगा (json स्ट्रिंग का एन्कोडिंग कार्य)।

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8")); 
bw.write(json); 
bw.flush(); 
bw.close(); 
+2

बिल्कुल सही। आपका धन्यवाद और आपका दिन शुभ रहे। – Jjang

1

जब एक String एक निर्गम धारा में (बाइट) लेखन, आप एन्कोडिंग रूपांतरण करने के लिए निर्दिष्ट करने के लिए की जरूरत है। एक तरीका है आउटपुट स्ट्रीम को OutputStreamWriter में लपेटना है जो एन्कोडिंग के लिए यूटीएफ -8 वर्णसेट का उपयोग करेगा।

 conn.setRequestProperty("content-type", "application/json; charset=utf-8"); 
     Writer writer = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8")); 
     writer.write(json); 
     writer.close(); 

flush() अगर आप close() फोन भी वैकल्पिक है।

peter.petrov द्वारा उल्लिखित एक और विकल्प है, पहले अपने String को बाइट्स (मेमोरी में) में कनवर्ट करना और फिर आउटपुट स्ट्रीम में बाइट सरणी आउटपुट करना है।

और सर्वर पक्ष पर इसे स्पष्ट करने के लिए, आप सामग्री-प्रकार शीर्षलेख ("content-type", "application/json; charset=utf-8") में उपयोग किए गए वर्णमाला को पारित कर सकते हैं।

1

StringEntity एन्कोडिंग सही है यह सुनिश्चित करने के लिए Charset का उपयोग करता है।

byte[] content = s.getBytes(charset); 

अपने कोड में ज्यादा परिवर्तन किए बिना आपकी लिखने जा सकता है:: यह ~ करता है

outputStream.write(json.getBytes("UTF-8")); 

अपने पढ़ने के लिए के रूप में, वहाँ readLine के साथ एक BufferedReader का प्रयोग करने में कोई मतलब नहीं सामान्य के अलावा है, लाइन का अंत यह अन्य विधियों की तुलना में बहुत धीमी है, क्योंकि इसे प्रत्येक बाइट को व्यक्तिगत रूप से पढ़ने की आवश्यकता है।

EntityUtils ज्यादातर कि करता है:

Reader reader = new InputStreamReader(conn.getInputStream(), "UTF-8"); 
    StringBuilder buffer = new StringBuilder(); 
    char[] tmp = new char[1024]; 
    int l; 
    while((l = reader.read(tmp)) != -1) { 
     buffer.append(tmp, 0, l); 
    } 
    responseString = buffer.toString(); 
संबंधित मुद्दे