2010-10-22 17 views
50

मेरे जावा वेब अनुप्रयोग एक AJAX अनुरोध है कि JSON देता है इस तरह प्रस्तुत:JSON वर्ण एन्कोडिंग

{'value': 'aériennes'} 

जब 'aériennes' वेबपेज में प्रदर्शित किया जाता है, यह 'ariennes' के रूप में प्रकट होता है, तो मैं वहाँ कुछ है लगता है चरित्र एन्कोडिंग समस्या की तरह। AJAX प्रतिक्रिया हेडर

Content-Type application/json 

जो किसी भी चारसेट जानकारी शामिल करने के प्रकट नहीं होता है शामिल हैं। मैं इस तरह

Content-Type text/html; charset=iso-8859-1  (or charset=utf8) 

अनुप्रयोग है वसंत MVC के सर्वर साइड कुछ को बदलने की आवश्यकता है लगता है, और मुझे लगता है कि प्रत्येक प्रतिक्रिया के लिए डिफ़ॉल्ट चारसेट स्थापित करने के लिए एक तरह से होना चाहिए?

उत्तर

14

पहले, अपने पोस्ट डेटा मान्य JSON नहीं है। यह होगा:

{"value": "aériennes"} 

नोट डबल कोट्स: वे आवश्यक हैं।

JSON डेटा should beapplication/json के लिए सामग्री प्रकार। वास्तविक JSON डेटा (क्या हम ऊपर है) UTF-8, UTF-16, या UTF-32 का उपयोग कर इनकोडिंग किया जाना चाहिए - मैं UTF-8 का उपयोग कर सलाह देते हैं।

आप नेटवर्क ट्रैफिक की निगरानी करने के लिए वायरसहार्क जैसे टूल का उपयोग कर सकते हैं और देख सकते हैं कि डेटा कैसा दिखता है, आपको बाइट c3 89 के लिए बाइट्स देखना चाहिए। मैंने स्प्रिंग के साथ कभी काम नहीं किया है, लेकिन यदि यह JSON एन्कोडिंग कर रहा है, तो शायद यह आपके लिए ठीक से देखभाल की जाती है।

एक बार JSON,, ब्राउज़र तक पहुँच जाता है यह होना चाहिए अच्छा है अगर यह वैध है। हालांकि, आप JSON प्रतिक्रिया से डेटा को वेबपृष्ठ में कैसे डाल रहे हैं?

52

लक्षण बताते हैं कि जेएसओएन स्ट्रिंग जो मूल रूप से यूटीएफ -8 एन्कोडिंग में थी, आईएसओ -885 9 -1 एन्कोडिंग का उपयोग करके HTTP प्रतिक्रिया में लिखा गया था और वेबब्रोसर को इसे यूटीएफ -8 के रूप में प्रदर्शित करने का निर्देश दिया गया था। यदि यह यूटीएफ -8 का उपयोग करके लिखा गया था और आईएसओ -885 9 -1 के रूप में प्रदर्शित किया गया था, तो आप aériennes देख चुके होंगे। यदि यह लिखा गया था और ISO-8859-1 का उपयोग कर प्रदर्शित किया है, तो आप a�riennes देखा होगा।

JSON स्ट्रिंग गलत तरीके से ISO-8859-1 के रूप में लिखा गया की समस्या को ठीक करने के लिए, यदि आप अपने वेब ऐप्लिकेशन/स्प्रिंग UTF-8 HTTP प्रतिसाद एन्कोडिंग के रूप में उपयोग करने के लिए कॉन्फ़िगर करना होगा। मूल रूप से, यह कवर के अंतर्गत निम्नलिखित करना चाहिए:

response.setCharacterEncoding("UTF-8"); 

अपनी सामग्री प्रकार हेडर परिवर्तित न करें। यह JSON के लिए बिल्कुल ठीक है और इसे यूटीएफ -8 के रूप में प्रदर्शित किया गया है।

4

यही मुझे क्या हुआ इस के साथ एक ही:

<%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%> 

लेकिन यह मेरे लिए काम करता है:

<%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%> 

अपने contentType को

;charset=UTF-8 

जोड़ने का प्रयास करें।

3
response.setContentType("application/json;charset=utf-8"); 
30

मुझे नहीं पता कि यह अब प्रासंगिक है या नहीं, लेकिन मैंने इसे @RequestMapping एनोटेशन के साथ तय किया है।

@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"}) 
+0

धन्यवाद लार्स जुएल जेन्सेन! आपके उत्तर ने इस पोस्ट की मेरी समस्या हल की है http://stackoverflow.com/questions/29865056/jquery-datatables-does-not-show-unicode-characters –

0

आप StringEntitythis कोशिश का उपयोग कर रहे हैं, तो वर्ण एन्कोडिंग की अपनी पसंद का उपयोग कर। यह विदेशी पात्रों को भी संभालता है।

6

अंत में मैं समाधान मिल गया:

केवल इस लाइन

@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8") 

यह निश्चित करने में मदद मिलेगी डाल दिया।

0
इसके अलावा

, आप receveing ​​आवेदन/json के लिए नियंत्रक श्रेणी से ऊपर RequestMapping वसंत एनोटेशन उपयोग कर सकते हैं; utf-8 सभी प्रतिसाद

@Controller 
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"}) 
public class MyController{ 
... 
} 
0

सुझाव दिया समाधान ऊपर अगर आपकी समस्या का समाधान नहीं में (मेरे लिए), यह भी मदद कर सकता है:

मेरी समस्या यह थी कि मैं स्प्रिंग्स @ResponseBody का उपयोग करके मेरी प्रतिक्रिया में एक जेसन स्ट्रिंग लौट रहा था। यदि आप इसे भी कर रहे हैं तो इससे मदद मिल सकती है।

अपने प्रेषक सर्वलेट में निम्नलिखित बीन जोड़ें।

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean 
       class="org.springframework.http.converter.StringHttpMessageConverter"> 
       <property name="supportedMediaTypes"> 
        <list> 
         <value>text/plain;charset=UTF-8</value> 
        </list> 
       </property> 
      </bean> 
     </list> 
    </property> 
</bean> 

(यहाँ मिला: http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8) यहाँ

1

जवाब मुझे मेरी समस्या का समाधान है, हालांकि यह पूरी तरह से संबंधित नहीं है मदद की। मैं javax.ws.rs एपीआई और @Produces और @Consumes एनोटेशन का उपयोग करता हूं और यह वही समस्या थी - जेएसओएन मैं webservice में लौट रहा था यूटीएफ -8 में नहीं था। मैं अपने नियंत्रक कार्यों के शीर्ष पर निम्नलिखित एनोटेशन के साथ इसे हल:

@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8") 

और

@Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8") 

हर endpoint के प्राप्त और बाद समारोह पर। मैं अक्षर स्थापित नहीं कर रहा था और यह हल हो गया। यह जर्सी का हिस्सा है, इसलिए शायद आपको एक मेवेन निर्भरता जोड़नी होगी।

संबंधित मुद्दे