2011-06-04 6 views
7

तो मैं अपने प्रोग्राम को नामों की सूची के साथ एक टेक्स्ट फ़ाइल आउटपुट करने की कोशिश कर रहा हूं। कुछ नामों में अस्ट्रोम जैसे अजीब पात्र हैं।मैं यूनिकोड में अजीब पात्रों को ग्रहण कैसे कर सकता हूं?

मैं किसी वेबपेज कि "UTF-8" में एन्कोड किया गया है से नाम के इन सूची पकड़ा है, या कम से कम मैं बहुत यकीन है कि क्योंकि पेज स्रोत का कहना है

"मेटा http-समतुल्य यह करता हूँ = "सामग्री-प्रकार" सामग्री = "पाठ/एचटीएमएल; charset = UTF-8 "/"

यह वही है मैं अब तक की कोशिश की है है:

public static void write(List<String> list) throws IOException { 
     Writer out = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8"); 
     try { 
      for (int i=0;i<list.size();i++) { 
       try { 
        byte[] utf8Bytes = list.get(i).getBytes("UTF-8"); 
        out.write(new String(utf8Bytes, "UTF-8")); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 

       out.write(System.getProperty("line.separator")); 

      } 
     } 
     finally { 
     out.close(); 
     } 
    } 

और मैं एक छोटे से कारण है कि यह काम नहीं कर रहा है के रूप में उलझन में हूँ। मुझे प्राप्त आउटपुट "à ... ström" है, जो बहुत अजीब है।

क्या कोई मुझे सही दिशा में इंगित कर सकता है? धन्यवाद!

और एक और असंबंधित नोट पर, वहाँ भद्दा

out.write के अलावा किसी पाठ फ़ाइल में एक नई लाइन लिखने के लिए (System.getProperty ("line.separator")) एक आसान तरीका है,

मेरे पास है? मैंने देखा कि ऑनलाइन कहीं और यह काम करता है, लेकिन मैं बस सोच रहा था कि एक क्लीनर तरीका था या नहीं।

+1

जब आप इसे चेक करते हैं तो फ़ाइल खोलने के लिए आप क्या उपयोग करते हैं? यह संभव है कि प्रोग्राम एन्कोडिंग गलत का पता लगा रहा हो। –

+0

इसके अलावा, वेबपृष्ठ के एन्कोडिंग की जांच करने के लिए, पता लगाए गए एन्कोडिंग को देखने का प्रयास करें। ब्राउज़र के आधार पर यह क्रोम में 'व्यू' मेनू या 'रिंच मेनू -> एन्कोडिंग' के तहत हो सकता है। –

+0

मैं नोटपैड में फ़ाइल खोल रहा हूं। जब मैं नोटपैड में शब्द को कॉपी और पेस्ट करता हूं तो अक्षर सही तरीके से दिखाई देते हैं, लेकिन जब मैं प्रोग्राम चलाता हूं तो मजाकिया सामान आता है। – wynnch

उत्तर

19

अपने Eclipse > Preferences > General > Workspace > Text file encoding को यूटीएफ -8 पर सेट करें।

+0

वाह कैसे भरते हैं, मुझे विश्वास नहीं है कि उत्तर यह आसान था। बहुत बहुत धन्यवाद!!! – wynnch

+0

बढ़िया! यदि आवश्यकता उत्पन्न होती है, तो आप 'प्रोजेक्ट> प्रॉपर्टीज> संसाधन' में प्रत्येक प्रोजेक्ट के लिए एक अलग एन्कोडिंग भी सेट कर सकते हैं। – trashgod

3

सामग्री वास्तव में यूटीएफ -8 में है और यह कंसोल पर मुद्रित होने पर ठीक प्रतीत होता है। क्या समस्या हो सकती है समस्या को डीकोडिंग और एन्कोडिंग स्ट्रिंग जो अनावश्यक है। आउटपुटस्ट्रीमवाइटर के बजाय java.io.PrintWriter का उपयोग करने का प्रयास करें। इसमें println विधियां हैं जो अंत में सिस्टम लाइन विभाजक के साथ स्ट्रिंग को मुद्रित करती हैं। यह कुछ ऐसा दिखाई देगा:

printStream.println(list.get(i)); 

साथ ही, फ़ाइल को खोलने पर इसे ब्राउज़र का उपयोग करने का प्रयास करने पर भी। वे आपको इसे खोलने के बाद एन्कोडिंग चुनने की अनुमति देते हैं ताकि आप वास्तव में उपयोग किए जा रहे कार्यों को देखने के लिए जल्दी से कई एन्कोडिंग आज़मा सकें।

1

नोटपैड विशेष रूप से समृद्ध संपादक नहीं है। यह दस्तावेज एन्कोडिंग का अनुमान लगाने का प्रयास करेगा, कभी-कभी unexpected results के साथ। "सादा पाठ" दस्तावेज़ों में उनके एन्कोडिंग के बारे में कोई मेटाडेटा नहीं होता है जो उन्हें कुछ सीमाएं देता है। एन्कोडिंग एक यूनिकोड प्रारूप है या नहीं, यह निर्धारित करने के लिए विंडोज ऐप्स (नोटपैड शामिल) अक्सर बाइट-ऑर्डर-मार्क (यू + एफईएफएफ या "\uFEFF" जावा स्ट्रिंग्स) पर भरोसा करते हैं। यह नोटपैड की मदद कर सकता है; यह आपके वेब पेज की समस्या के लिए बेकार होगा।

एचटीएमएल 4 spec how output encoding should be set परिभाषित करता है। मेटा एन्कोडिंग निर्दिष्ट करने के अलावा आपको Content-Type HTTP शीर्षलेख सेट करना चाहिए।

आप अपने वेब ऐप में जो भी उपयोग कर रहे हैं उसका उल्लेख नहीं करते हैं। एक सर्वलेट को सामग्री प्रकार setContentType("text/html; charset=UTF-8") सेट करना चाहिए; एक जेएसपी को ऐसा करने के लिए पृष्ठ निर्देश का उपयोग करना चाहिए। अन्य दृश्य प्रौद्योगिकियां समान तंत्र प्रदान करेंगी।


byte[] utf8Bytes = list.get(i).getBytes("UTF-8"); 
out.write(new String(utf8Bytes, "UTF-8")); 

इस कोड को कुछ बेकार संचालन करता है; यह यूटीएफ -16 से यूटीएफ -8 तक चरित्र डेटा ट्रांसकोड करता है, फिर यूटीएफ -8 से यूटीएफ -16 तक, फिर Writer पर डेटा लिखता है (जो यूटीएफ -16 को फिर से यूटीएफ -8 में ट्रांसकोड करेगा)। न्यू लाइन सहायता प्राप्त करने के

String str = list.get(i); 
out.write(str); 

उपयोग एक PrintWriter: इस कोड के बराबर है।


आप जावा here, here और here में वर्ण एन्कोडिंग के बारे में अधिक पढ़ सकते हैं।

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

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