2011-05-11 14 views
11

मैं यूनिकोड पर पढ़ रहा है और UTF-8 एन्कोडिंग में प्रदर्शित नहीं और मुझे लगता है कि मैं इसे समझते हैं, इसलिए उम्मीद है कि इस एक बेवकूफ सवाल हो जाएगा मेरे पास एक फ़ाइल है जिसमें कुछ सीजेके पात्र हैं, और जिसे यूटीएफ -8 के रूप में सहेजा गया है। मेरे पास विभिन्न एशियाई भाषा पैक स्थापित हैं और पात्रों को अन्य अनुप्रयोगों द्वारा ठीक से प्रस्तुत किया जाता है, इसलिए मुझे पता है कि बहुत सारे काम हैं।UTF-8 CJK पात्रों थोड़ी देर के लिए जावा

// Create objects 
fis = new FileInputStream(new File("xyz.sgf")); 
InputStreamReader is = new InputStreamReader(fis, Charset.forName("UTF-8")); 
BufferedReader br = new BufferedReader(is); 

// Read and display file contents 
StringBuffer sb = new StringBuffer(); 
String line; 
while ((line = br.readLine()) != null) { 
    sb.append(line); 
} 
System.out.println(sb); 

उत्पादन '???' के रूप में CJK वर्ण दिखाता है:

मेरी जावा अनुप्रयोग में, मैं फ़ाइल के रूप में इस पढ़ें। is.getEncoding() पर एक कॉल की पुष्टि है कि यह निश्चित रूप से यूटीएफ -8 का उपयोग कर रहा है। पात्रों को ठीक से प्रकट करने के लिए मुझे क्या कदम याद आ रहा है? यदि इससे कोई फर्क पड़ता है, तो मैं एक्लिप्स कंसोल का उपयोग करके आउटपुट देख रहा हूं।

+0

आईडीई (नेटबीन्स, ग्रहण, आदि ...) आप क्या उपयोग कर रहे हैं? – Abdelwahed

+0

@Abdelwahed ग्रहण (हेलीओस) – Twicetimes

+1

मैंने पहले अरबी पात्रों के साथ कोशिश की और मुझे एक ही समस्या थी। लेकिन जब मैंने एक बीक पॉइंट रखा और स्ट्रिंग की जांच की तो मैंने स्ट्रिंग को सही ढंग से प्रदर्शित किया। मैंने इसे एक फाइल में मुद्रित किया और यह ठीक था। – Abdelwahed

उत्तर

15
System.out.println(sb); 

समस्या उपरोक्त पंक्ति है में विस्तार से बताया। यह डिफ़ॉल्ट सिस्टम एन्कोडिंग का उपयोग करके वर्ण डेटा को एन्कोड करेगा और डेटा को STDOUT पर उत्सर्जित करेगा। कई प्रणालियों पर, यह एक हानिकारक प्रक्रिया है।

यदि आप डिफ़ॉल्ट बदलते हैं, तो System.out द्वारा उपयोग किया जाने वाला एन्कोडिंग और कंसोल द्वारा उपयोग किए जाने वाले एन्कोडिंग का मिलान होना चाहिए।

डिफ़ॉल्ट सिस्टम एन्कोडिंग को बदलने के लिए एकमात्र समर्थित तंत्र ऑपरेटिंग सिस्टम के माध्यम से है। (कुछ file.encoding प्रणाली संपत्ति का उपयोग कर सलाह देंगे, लेकिन इस not supported है और अनायास ही दुष्प्रभाव हो सकता है।) आप अपने स्वयं के कस्टम PrintStream करने के लिए setOut उपयोग कर सकते हैं:

PrintStream stdout = new PrintStream(System.out, autoFlush, encoding); 

आप के माध्यम से ग्रहण सांत्वना एन्कोडिंग को बदल सकते हैं Run configuration

आप मेरे ब्लॉग पर इस विषय के बारे में कई पोस्ट देख सकते हैं - मेरी प्रोफ़ाइल के माध्यम से।

+1

बहुत जानकारीपूर्ण, धन्यवाद। दुर्भाग्य से मैं इस जवाब को अभी तक वोट नहीं दे सकता क्योंकि मेरी प्रतिष्ठा काफी अधिक नहीं है। – Twicetimes

+1

मैंने यूटीएफ -8 का उपयोग करने के लिए रन कॉन्फ़िगरेशन बदल दिया है, और मैंने एक कस्टम प्रिंटस्ट्रीम को निम्नानुसार लगाया है: 'प्रिंटस्ट्रीम utfout = नया प्रिंटस्ट्रीम (System.out, false, "UTF-8"); System.setOut (utfout); ', लेकिन वर्ण अभी भी ग्रहण कंसोल विंडो में ठीक से प्रदर्शित नहीं होते हैं। आश्चर्यजनक रूप से, वे '?' के रूप में प्रदर्शित होने से चले गए हैं इसके बजाय एक वर्ग ब्लॉक के लिए, तो कुछ हो रहा है। बस यकीन नहीं है कि क्या। – Twicetimes

+2

@Twicetimes - यह वास्तव में बेहतर है, लेकिन यह वह जगह है जहां यह मुश्किल हो सकती है। मेरे सिस्टम पर, _Courier न्यू_ का उपयोग करने के बावजूद जो चीनी ग्रैफेम्स का समर्थन नहीं करता है, फ़ॉन्ट प्रतिस्थापन का उपयोग चीनी तारों को प्रस्तुत करने के लिए किया जाता है। मेरा मानना ​​है कि विंडोज़ पर एसडब्ल्यूटी यूनिस्क्रैब का उपयोग करता है, इसलिए यह देखने के लिए आपको Win32 एपीआई पर पढ़ने की आवश्यकता हो सकती है कि यह कैसे होता है। आपके पास फ़ॉन्ट्स का सही संयोजन स्थापित नहीं हो सकता है। आप [फोंट स्विच] [http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.user/reference/ref-fonts.htm) कर सकते हैं जहां कोड पॉइंट [समर्थित] हैं (http://en.wikipedia.org/wiki/Character_Map)। – McDowell

2

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

उदाहरण के लिए विंडोज़ पर सीएमडी लगभग हमेशा WIN1252 या एक समान एकल बाइट वर्णमाला का उपयोग करता है।

+0

हाँ, मैं विंडोज सेमीडी को सही तरीके से प्रदर्शित करने की अपेक्षा नहीं करता, लेकिन मैंने सोचा कि ग्रहण होगा। यदि यह वास्तव में समस्या की जड़ है, तो क्या कोई और सत्यापित कर सकता है कि ग्रहण कुछ कंसोल में कुछ यूनिकोड वर्णों को ठीक से प्रदर्शित नहीं करता है? यह काम करने के लिए प्रोग्राम के आउटपुट को और कहां प्रदर्शित कर सकता है? – Twicetimes

+1

@Twicetimes: आउटपुट को एक फ़ाइल में पाइप करें और उस फ़ाइल को यूटीएफ -8 सक्षम संपादक के साथ खोलें। –

+0

@ क्रिस्टोफर हैमरस्ट्रॉम - सुझाव के लिए धन्यवाद। मैंने यूटीएफ -8 वर्णसेट के साथ आउटपुटस्ट्रीमवाइटर का उपयोग करके सीधे फ़ाइल को स्ट्रिंग लिखा था, और परिणामी फ़ाइल वर्णों को किसी अन्य ऐप में सही तरीके से दिखाती है, इसलिए मुझे लगता है कि सब ठीक है। केवल ग्रहण कंसोल होना चाहिए जो मुझे फेंक दिया। – Twicetimes

4

निम्न प्रोग्राम टेक्स्टपैड का उपयोग कर कंसोल में सीजेके पात्रों को प्रिंट करता है।कोरियाई हंगुल और जापानी हीरागाना मैं जावा बताने के लिए EUC_KR करने के लिए प्रिंट धारा के कूट बदल सकते हैं और TextPad के उपकरण उत्पादन विंडो के गुणों को सेट करने के लिए किया था देखने के लिए:

  • फ़ॉन्ट Arial Unicode MS है
  • स्क्रिप्ट हंगुल है

import java.io.PrintStream; 
import java.io.UnsupportedEncodingException; 

class Hangul { 

    public static void main(String[] args) throws Exception { 

     // Change console encoding to Korean 

     PrintStream out = new PrintStream(System.out, true, "EUC_KR"); 
     System.setOut(out); 

     // Print sample to console 

     String go_hello = "가다 こんにちは"; 
     System.out.println(go_hello); 
    } 
} 

उपकरण आउटपुट है:

가다 こ ん に ち は

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