java - jsp utf एन्कोडिंग




encoding (3)

मुझे इस समस्या को कैसे निपटाना है यह पता लगाने में कठिन समय रहा है:

मैं एक इतालवी विश्वविद्यालय के लिए एक वेब उपकरण विकसित कर रहा हूं, और मुझे एक्सेन्ट (जैसे è, ù, ...) के साथ शब्दों को प्रदर्शित करना है; कभी-कभी मुझे ये शब्द पोस्टग्रेएससीएल तालिका (यूटीएफ 8-एन्कोडेड) से मिलते हैं, लेकिन ज्यादातर मुझे एक फ़ाइल से लंबा अंश पढ़ना पड़ता है। इन फाइलों को यूटीएफ -8 एक्सएमएल के रूप में एन्कोड किया गया है, और स्मल्ट्रॉन या किसी भी यूटीएफ -8 संपादक में ठीक प्रदर्शन किया गया है (उन्हें "è" के स्थान पर (उदाहरण के लिए è जैसे पीथन पुरानी फाइलों में पार्सिंग बनाया गया था)

मैंने एक जावा क्लास लिखा था जो एक्सएमएल फाइल से संबंधित खंडों को निकालता है, जो इस तरह काम करता है:

String s = parseText(filename, position)

अगर मैं लौटा स्ट्रिंग एक फाइल में लिखूं, तो सब कुछ ठीक दिखता है; समस्या यह है कि अगर मैं करता हूं

out.write(s)

jsp पृष्ठ में, मुझे अजीब अक्षर मिलता है वैसे, मैं उपयोग करता हूँ

String s = getWordFromPostgresql(...)

out.write(s)

बहुत ही jsp में और यह ठीक दिखाता है।

कोई संकेत?

धन्यवाद निकोला

@ क्रोसेनवॉल्ड

आपकी प्रतिक्रिया के लिए धन्यवाद, हालांकि यह निर्देश पहले से पृष्ठ में है, लेकिन यह काम नहीं करता है (वास्तव में यह "काम करता है" लेकिन डेटाबेस से प्राप्त होने वाले तारों के लिए)। मुझे लगता है कि फाइलों से पढ़ने के बारे में कुछ है, लेकिन मैं समझ नहीं पा रहा हूं ... वे "जावा" में काम करते हैं लेकिन "जेस्प" में नहीं (बेहतर स्पष्टीकरण के बारे में नहीं सोच सकते हैं ...)

यहां वास्तविक कोड से निकाली गई एक बुनियादी उदाहरण है: स्ट्रिंग (पाठ युक्त) के लिए मार्क से (एक ऑब्जेक्ट पाठ में स्थिति का प्रतिनिधित्व करता है) एक मैक से फाइल से पढ़ने के लिए विधि:

यह .jsp पृष्ठ में है (उपरोक्त पदों में उद्धृत यूटीएफ-डायरेक्टिव के साथ)

    // ...
    Map<Mark, String> map = TestoMarkParser.parseMarks(...);
    out.write(map.get(m));

और यह परिणाम है:

"फू पर्टो कॉसर्स इन यूएसएल जीनेर एनहर्मोनिको, चे क्लेली क्वालिली वी सर्सिटिवानो,"

अगर मैं एक जावा कोड में एक ही कोड डालता हूं, और विकल्प बदलता हूं। System.out.println के साथ लिखें, इसका परिणाम यह है:

"फू पर्स कॉस आईईएल एनिनर एनहर्मोनिको, चे क्लेली क्वालिली विक्ट बेस्क्रिटेवानो,"

मैं हेक्स संपादक के साथ कुछ विश्लेषण कर रहा हूं, यहां यह है:

मूल स्ट्रिंग: "फू पेरो कॉसी"

ò में xml फ़ाइल: सी 3 बी 2

ò जैसा jsp फ़ाइल में out.write () द्वारा प्रदान किया गया है: E2 88 9 ए E2 89 A4

ò के माध्यम से फाइल करने के लिए लिखा के रूप में:

FileWriter w = new FileWriter(new File("out.txt"));
w.write(s);     // s is the parsed string
w.close();

सी 3 बी 2

प्रत्येक वर्ण के गुणों को एक int के रूप में प्रिंट करना

0: 70 = F
1: 117 = u
2: 32 =  
3: 112 = p
4: 101 = e
5: 114 = r
6: 8730 =  
7: 8804 =  
8: 32 =  
9: 99 = c
10: 111 = o
11: 115 = s
12: 8730 = 
13: 168 = 
14: 10 = `

String s = parseText(filename, position)

यह विधि कहां परिभाषित है? मैं अनुमान लगा रहा हूं कि यह आपकी अपनी पद्धति है, जो फ़ाइल खोलता है और डेटा का एक विशेष हिस्सा निकालता है। कहीं इस प्रक्रिया में यह बाइट्स से लेकर अक्षरों तक परिवर्तित हो रहा है, संभवत: आपके जेवीएम के लिए डिफ़ॉल्ट एन्कोडिंग का उपयोग कर रहा है।

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

यदि स्रोत फ़ाइलें अच्छी तरह से बनाई गई XML में हैं, तो आप असली पार्सर (जैसे कि जेडीके में बनाया गया) का उपयोग करने के लिए बेहतर होगा, क्योंकि पार्सर्स वर्णों के लिए बाइट का सही अनुवाद प्रदान करेगा। फिर मूल्यों को पुनः प्राप्त करने के लिए एक XPath अभिव्यक्ति का उपयोग करें

अगर आपने अतीत में एक्सएमएल पार्सर का इस्तेमाल नहीं किया है, तो यहां दो दस्तावेज हैं जो मैंने पार्सिंग और एक्सपाथ पर लिखा था।

संपादित करें: एक चीज जो आपको सहायक मिल सकती है वह स्ट्रिंग में वास्तविक वर्ण मानों को प्रिंट करने के लिए, जैसा कि निम्नलिखित की तरह कुछ का उपयोग करना है:

public static void main(String[] argv) throws Exception
{
    String s = "testing\u20ac";
    for (int ii = 0 ; ii < s.length() ; ii++)
    {
        System.out.println(ii + ": " + (int)s.charAt(ii) + " = " + s.charAt(ii));
    }
}

आपको संभवतः भी अपना डिफ़ॉल्ट वर्ण सेट मुद्रित करना चाहिए, ताकि आपको पता हो कि बाइट्स के किसी विशेष अनुक्रम को वर्णों में अनुवाद किया गया है:

public static void main(String[] argv) throws Exception
{
    System.out.println(Charset.defaultCharset());
}

और अंत में, आपको ग्राहक को लौटा दिया जा रहा है, यह देखने के लिए आपको सेवा के पृष्ठ को कच्चे बाइट के रूप में देखना चाहिए।

# 2 संपादित करें: चरित्र is यूनिकोड का मूल्य 00F2 है, जो यूटीएफ -8 को सी 3 बी 2 के रूप में एन्कोड किया जाएगा। ये दो कोड उन प्रतीकों के अनुरूप नहीं हैं जो आपने अपने पहले उत्तर में दिखाए हैं।

यूनिकोड वर्णों के बारे में अधिक जानने के लिए, यूनिकोड.org पर कोड चार्ट देखें।


Jsp पृष्ठ निर्देश में आपको अपने कंटेंट-टाइप को यूटीएफ -8 में सेट करने का प्रयास करना चाहिए, जो पेज एन्कोडिंग को यूटीएफ -8 में भी सेट कर देगा।

<%@page contentType="text/html;charset=UTF-8"%>

यूटीएफ -8 जेएसपी में डिफ़ॉल्ट सामग्री प्रकार नहीं है , और इस से उत्पन्न होने वाली सभी प्रकार की रोचक समस्याएं हैं। समस्या यह है कि अंतर्निहित स्ट्रीम को आईएसओ -885 9 -1 स्ट्रीम के रूप में डिफ़ॉल्ट रूप से परिभाषित किया जाता है। यदि आप इस स्ट्रीम में कुछ यूनिकोड बाइट लिखते हैं, तो उन्हें आईएसओ -8859-1 के रूप में व्याख्या की जाएगी मुझे लगता है कि यूटीएफ -8 के लिए एन्कोडिंग सेट करना सबसे अच्छा समाधान है

संपादित करें : इसके अलावा, जावा में एक स्ट्रिंग चर हमेशा यूनिकोड होना चाहिए। तो आपको हमेशा कहने में सक्षम होना चाहिए

System.out.println(myString) 

और अपने वेब-सर्वर के कंसोल विंडो में (या बस डीबगर में रोकें और जांच कर) उचित वर्ण सेट देखें मुझे संदेह है कि जब आप ऐसा करते हैं, तो आप गलत वर्णों को देख रहे होंगे, जिससे मुझे यह मानना ​​पड़ेगा कि स्ट्रिंग के निर्माण में आपके पास एन्कोडिंग समस्या है।


मुझे भी यही समस्या थी, सब कुछ "यूटीएफ -8" है और मैं क्यों देखता हूं
मूर्खतापूर्ण वर्ण और समस्या jsp में थी और यह पृष्ठ के मुखिया होना चाहिए।

 <%request.setCharacterEncoding("utf-8");%>

और सब कुछ ठीक हो जाएगा





utf