2010-11-16 16 views
29

के लिए एक csv फ़ाइल के लिए फारसी शब्द जोड़ OpenCSV के माध्यम से मैं इस कोड का उपयोग कर रहा हूँ:की स्थापना एक UTF-8 जावा और csv फ़ाइल में

String[] entries="\u0645 \u062E\u062F\u0627".split("#"); 
try{ 
    CSVWriter writer=new CSVWriter(new OutputStreamWriter(new FileOutputStream("C:\\test.csv"), "UTF-8")); 

    writer.writeNext(entries); 
    writer.close(); 
} 
catch(IOException ioe){ 
    ioe.printStackTrace(); 
} 

जब मैं जिसके परिणामस्वरूप csv फ़ाइल खोलते हैं, तो Excel में, यह शामिल "ứỶờịỆ"। नोटपैड.एक्सई जैसे अन्य प्रोग्रामों में यह समस्या नहीं है, लेकिन मेरे सभी उपयोगकर्ता एमएस एक्सेल का उपयोग कर रहे हैं।

SuperCSV के साथ ओपनसीएसवी को बदलने से इस समस्या का समाधान नहीं होता है।

जब मैंने मैन्युअल रूप से सीएसवी फ़ाइल में फारसी वर्ण टाइप किए, तो मुझे कोई समस्या नहीं है।

+0

निश्चित रूप से एक सटीक डुप्लिकेट। मैंने उपर्युक्त लिंक से समाधान के साथ इस समस्या का प्रयास किया (यूटीएफ -8 में एक्सेल को पढ़ने के लिए बीओएम का उपयोग करें) और इस समस्या को हल किया। वैकल्पिक रूप से, स्पष्ट रूप से यूटीएफ -16 कार्यों का उपयोग करके एक्सेल को एएससीआईआई में सीएसवी को पढ़ने के लिए मजबूर करने के लिए मजबूर नहीं किया जाता है। –

+0

एलेक्सआर की पोस्ट के समान एक उपयोगी लिंक है! http://weblogs.java.net/blog/joconner/archive/2010/03/24/writing-csv-files-utf-8-excel – Hamedz

उत्तर

8

दुर्भाग्यवश, सीएसवी कोई मेटाडाटा नहीं है और कोई वास्तविक मानक नहीं है जो एक लचीला एन्कोडिंग जरूरी है। जब तक आप सीएसवी का उपयोग करते हैं, आप एएससीआईआई के बाहर किसी भी पात्र का विश्वसनीय रूप से उपयोग नहीं कर सकते हैं।

आपका विकल्प:

  • एक्सएमएल के लिए लिखें (जो एन्कोडिंग मेटाडाटा अगर आप इसे सही करना है) और एक्सेल में उन import the XML है।
  • वास्तविक एक्सेल दस्तावेज़ बनाने के लिए Apache POI का उपयोग करें।
+0

एक्सएमएल और पीओआई ठीक हैं लेकिन सीएसवी भी काम करता है। कृपया मेरी टिप्पणी देखें। मैं CSV फ़ाइल बनाने में कामयाब रहा जिसमें यूनिकोड प्रतीक शामिल हैं और एमएस एक्सेल के साथ खोला जा सकता है। – AlexR

+1

@AlexR: यह एक्सेल या अन्य प्रोग्राम्स के किसी दिए गए संस्करण के लिए काम कर सकता है या नहीं, या यह फ़ाइल को अमान्य के रूप में अस्वीकार कर सकता है, या कुछ नकली पात्रों को पहले सेल में डाल सकता है। आपके कार्यक्रम का व्यवहार अनियंत्रित विशेषताओं पर भरोसा नहीं करना चाहिए। –

3

एक्सेल CSV फ़ाइलों को खोलने के लिए UTF8 का उपयोग नहीं करता है। एक ज्ञात समस्या है। इस्तेमाल किया गया वास्तविक एन्कोडिंग माइक्रोसॉफ्ट विंडोज की लोकेल सेटिंग्स पर निर्भर करता है। उदाहरण के लिए जर्मन लकोले के साथ एक्सेल CP1252 के साथ एक CSV फ़ाइल खोल देगा।

आप कुछ पर्सियन वर्ण वाले एक्सेल फ़ाइल बना सकते हैं और इसे CSV फ़ाइल के रूप में सहेज सकते हैं। फिर इस फ़ाइल को पढ़ने और कुछ सामान्य एन्कोडिंग का परीक्षण करने के लिए एक छोटा जावा प्रोग्राम लिखें। सीएसवी फाइलों में जर्मन उमॉट्स के लिए सही एन्कोडिंग का पता लगाने के तरीके का उपयोग करता है।

+2

दुर्भाग्य से यह गलत है। मैं यूनिकोड प्रतीकों के साथ सीएसवी फ़ाइल बनाने में कामयाब रहा जो एक्सेल के साथ खोला जा सकता है। बाद में मेरी टिप्पणी देखें – AlexR

89

मैंने कुछ समय बिताया लेकिन आपकी समस्या के लिए समाधान मिला।

सबसे पहले मैंने नोटपैड खोला और निम्न पंक्ति लिखी: שלום, हैलो, привет फिर मैंने इसे यूटीएफ -8 का उपयोग करके फ़ाइल he-en-ru.csv के रूप में सहेजा। फिर मैंने इसे एमएस एक्सेल के साथ खोला और सब कुछ ठीक से काम किया।

अब, मैं एक साधारण जावा प्रोग्राम है जो निम्नलिखित के रूप में दर्ज करने के लिए इस लाइन प्रिंट लिखा: "। Gibrish"

PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8")); 
    w.print(line); 
    w.flush(); 
    w.close(); 

जब मैं इस फाइल एक्सेल का उपयोग कर मैंने देखा खोला

तो मैं 2 फ़ाइलों की सामग्री को पढ़ने के लिए कोशिश की और (उम्मीद के रूप में) देखा नोटपैड द्वारा उत्पन्न उस फ़ाइल 3 बाइट्स उपसर्ग है: तो

239 EF 
    187 BB 
    191 BF 

, मैं इस उपसर्ग पहले और पाठ मुद्रित करने के लिए मेरे कोड को संशोधित किया उसके बाद:

String line = "שלום, hello, привет"; 
    OutputStream os = new FileOutputStream("c:/temp/j.csv"); 
    os.write(239); 
    os.write(187); 
    os.write(191); 

    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8")); 

    w.print(line); 
    w.flush(); 
    w.close(); 

और यह काम किया! मैंने एक्सेल का उपयोग करके फ़ाइल खोली और मुझे अपेक्षित पाठ देखा।

नीचे पंक्ति: सामग्री लिखने से पहले इन 3 बाइट्स लिखें। यह उपसर्ग इंगित करता है कि सामग्री 'यूटीएफ -8 में BOM' है (अन्यथा यह केवल 'यूओटीएफ -8 बिना बीओएम' है)।

+3

http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 – Arjan

+0

वैज्ञानिक विवरण के लिए धन्यवाद। जानना अच्छा है ... – AlexR

+0

माइक्रोसॉफ्ट एक्सेल का कौन सा संस्करण आपने अपने परीक्षण के लिए उपयोग किया था? – chkal