2016-08-31 3 views
9

पर कॉल में utf8 एन्कोडिंग को लागू करें मैं एक नोड मध्य-स्तर से जावा बैकएंड में कॉल कर रहा हूं और क्वेरी पैरा के रूप में एक स्ट्रिंग पास कर रहा हूं। जब तक गैर-अंग्रेज़ी वर्णमाला वर्ण का उपयोग नहीं किया जाता है तब तक सबकुछ बढ़िया काम करता है (उदा: ř, ý)। जब जावा इन पात्रों को प्राप्त करता है फेंक देता है:नोड से जावा

parse exception: org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! 

इस कॉल पूरी तरह से काम करता है:

GET http://localhost:8000/server/name?name=smith 

इस कॉल ऊपर त्रुटि के साथ विफल:

GET http://localhost:8000/server/name?name=sořovský 

मेरा प्रश्न शामिल है जहां इस मुद्दे के समाधान के लिए । मुझे नोड के लिए this utf8 एन्कोडर मिला है और भविष्य में मेरी जावा परत को कॉल करने से पहले मेरे स्ट्रिंग को utf8 के रूप में एन्कोड करने के बारे में सोच रहा था। क्या यह सही दृष्टिकोण है या क्या मुझे जावा के भीतर कुछ करना चाहिए?

{ 
    ... 
    accept: 'application/json, text/plain, */*', 
    'accept-encoding': 'gzip, deflate, sdch', 
    'accept-language': 'en-US,en;q=0.8,el;q=0.6', 
    ... 
} 
+1

यदि जावा पक्ष आपको यह त्रुटि देता है, तो इनपुट यूटीएफ -8 में उचित रूप से एन्कोड नहीं किया गया है, इसलिए आपको यह देखना होगा कि नोड पक्ष इसे ठीक से एन्कोड क्यों नहीं कर रहा है। अधिक जानकारी के बिना (आपका कोड कैसा दिखता है?) अधिक विस्तृत उत्तर देने में बहुत मुश्किल है। – Jesper

+0

@ जेस्पर, धन्यवाद! मैंने अपने अनुरोध विकल्पों को दिखाते हुए अपने प्रश्न में ब्योरा जोड़ा। – MattDionis

+2

आपके यूआरएल (और संभावित अनुरोध शीर्षलेख) के बारे में अधिक जानकारी चाहिए। क्या आप अनुरोध हेडर को कैप्चर कर सकते हैं और इसे अपने प्रश्न में जोड़ सकते हैं? –

उत्तर

1

अपनी जावास्क्रिप्ट फ़ाइल utf8 में सहेजें।

var name = "sořovský", 
    param1 = encodeURIComponent(name); 

var url = "http://localhost:8000/server/name?name=" + param1; 

console.log(url); 
// http://localhost:8000/server/name?name=so%C5%99ovsk%C3%BD 

आप GET http://localhost:8000/server/name?name=sořovský साथ लॉग देख सकते हैं:

{ 
    "args": { 
    "name": "sořovský" 
    }, 
    "headers": { 
    "Accept": "application/json, text/plain, */*", 
    "Accept-encoding": "gzip, deflate, sdch", 
    "Accept-language": "en-US,en;q=0.8,el;q=0.6", 
    //... 
    }, 
    "url": "http://localhost:8000/server/name?name=sořovský" 
} 
1

प्राप्त केवल अन्य पात्रों आप प्रतिशत एनकोड करने के लिए विशेष वर्ण की जरूरत है भेजने के लिए ASCII char.set समर्थन करता है:

ध्यान दें, यह क्या मेरी प्रासंगिक अनुरोध हेडर की तरह लग रही है।

+0

तो ऐसा लगता है कि मेरे विकल्प 'GET' को' POST' में बदल रहे हैं या क्वेरी पैराम के रूप में इसे पास करने से पहले स्ट्रिंग को एन्कोड कर रहे हैं। – MattDionis

+0

हां यह सही है। एन्कोडिंग मेरी राय में आपकी पहली पसंद होनी चाहिए। –

0

यह है कि सर्वर वास्तव में अपनी डिफ़ॉल्ट एन्कोडिंग के रूप में UTF-8 का उपयोग नहीं करता संभव है का उपयोग करता है (के रूप में एक सामान्य रूप से मान हो सकता है), लेकिन इसके बजाय ISO-8859-1।

जिसे उम्मीद की जा सकती है, यूटीएफ -8 का उपयोग करके डीकोड करने में असफल हो जाएगी (यह केवल गैर-असीसी पात्रों पर स्पष्ट होगा)। मुझे जेबॉस सर्वर के साथ एक बहुत ही समान समस्या थी।

String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8"); 
0

यह प्रतीत आप की तरह UTF16 स्ट्रिंग भेज रहे हैं और के रूप में इलाज:

मेरे लिए समाधान के बजाय request.getParameter() (जो अपने आप पैरामीटर utf-8 का उपयोग कर धर्मान्तरित) का उपयोग कर के बजाय का उपयोग करने की थी UTF-8। सभी जावास्क्रिप्ट तार यूटीएफ 16 हैं। तो यह हो सकता है कि पैरा को यूटीएफ 16 के रूप में भी भेजा जा रहा है। आप चीजों को जावा पक्ष पर एक यूटीएफ 16 एन्कोडर के माध्यम से पैरा भेजने की कोशिश कर सकते हैं और फिर इसे जो भी एन्कोडिंग चाहते हैं उसे परिवर्तित कर सकते हैं।

सुनिश्चित करें कि आप अपनी मशीन के साथ-साथ अंतहीनता की जांच भी करें। आशा है कि ये आपकी मदद करेगा।

+0

जावास्क्रिप्ट की तुलना में जावा में यूटीएफ 16 -> यूटीएफ 8 से स्ट्रिंग को कन्वर्ट करना आसान होगा। मुझे यकीन है कि एपीआई का एक टन है। – dimitrirostavo

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