2010-06-10 11 views
10

में कनवर्ट करने के लिए कैसे करें मेरे पास एक फ़ाइल है जिसमें कुछ गैर-utf8 कारक (जैसे "आईएसओ -885 9 -1") हैं, और इसलिए मैं उस फ़ाइल को (या पढ़ना) यूटीएफ 8 एन्कोडिंग में कनवर्ट करना चाहता हूं, यह मेरे द्वारा कैसे हो सकता है?जावा: फ़ाइल को utf8

कोड यह इस तरह है:

File file = new File("some_file_with_non_utf8_characters.txt"); 

/* some code to convert the file to an utf8 file */ 

... 

संपादित करें: कोई एन्कोडिंग उदाहरण

+0

गैर UTF8? थोड़ा सा संकीर्ण करना चाहते हैं? एक बार जब आप इनपुट एन्कोडिंग जानते हैं तो यह आसान है, और यदि आप नहीं करते हैं तो अनिवार्य रूप से असंभव है। –

+0

कुछ विचार, फ़ाइलें बड़ी हैं (जैसे 1 जीबी) इसलिए मैं उन्हें स्ट्रिंग ऑब्जेक्ट में नहीं डाल सकता ... –

+0

आपकी फ़ाइल का एन्कोडिंग क्या है? यदि आप लिनक्स या ओएस एक्स (और अन्य अन * एक्स) पर हैं तो आप बस टाइप कर सकते हैं: * file some_file * और यह आपको एन्कोडिंग बताएगा। बीटीडब्ल्यू, यदि आप अन * एक्स (कम से कम दोनों लिनक्स और ओएस एक्स) पर हैं, तो आपके पास * iconv * कमांड लाइन होनी चाहिए। * "मैन iconv" * कहता है: * "दिए गए फ़ाइलों के एन्कोडिंग को एक एन्कोडिंग से दूसरे में कनवर्ट करें" *, जो तर्कसंगत रूप से एक स्व-लिखित जावा उपयोग की तुलना में 1 जीबी फ़ाइल पर बेहतर काम करेगा। ध्यान दें कि UTF-8 एन्कोडिंग हर एक यूनिकोड कोडपॉइंट प्रतिनिधित्व कर सकते हैं, इसलिए कह रही है कि फ़ाइल * * संदिग्ध लग रहा है ... – NoozNooz42

उत्तर

8
String charset = "ISO-8859-1"; // or what corresponds 
    BufferedReader in = new BufferedReader( 
     new InputStreamReader (new FileInputStream(file), charset)); 
    String line; 
    while((line = in.readLine()) != null) { 
    .... 
    } 

वहाँ आप पाठ डीकोड है, होगा। आप इसे एन्कोडिंग (जैसे यूटीएफ -8) के साथ, सिमेट्रिक राइटर/आउटपुटस्ट्रीम विधियों द्वारा लिख ​​सकते हैं।

+0

निश्चित रूप से लाइन – OscarRyz

+2

द्वारा लाइन को पढ़ने के लिए आवश्यक नहीं है, यह सिर्फ एक सकारात्मक तरीका है। – leonbloy

+0

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

1

आप केवल UTF-8 के रूप में यह पढ़ना चाहते हैं कैसे रखूं? जो मैंने हाल ही में एक समान समस्या दी है वह है- जेएफवी को -Dfile.encoding = UTF-8 के साथ शुरू करना, और सामान्य रूप से पढ़ने/प्रिंट करना। मुझे नहीं पता कि यह आपके मामले में लागू है या नहीं।

कि विकल्प के साथ

:

System.out.println("á é í ó ú") 

प्रिंट सही ढंग से अक्षर। अन्यथा यह एक प्रिंट करता है? प्रतीक

+2

http : //bugs.sun.com/view_bug.do? bug_id = 4163515 – McDowell

+0

@ एमसीडी: मैं एक ही टिप्पणी पोस्ट करने जा रहा था। यह '-Dfile.encoding' के उपयोग की गलत व्याख्या है। – BalusC

+0

मुझे लगता है, यह वास्तव में एक गड़बड़ है। – Ismael

4

आपको इनपुट फ़ाइल के एन्कोडिंग को जानने की आवश्यकता है। उदाहरण के लिए, यदि फ़ाइल लैटिन -1 में है, तो आप कुछ इस तरह

 FileInputStream fis = new FileInputStream("test.in"); 
     InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1"); 
     Reader in = new BufferedReader(isr); 
     FileOutputStream fos = new FileOutputStream("test.out"); 
     OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); 
     Writer out = new BufferedWriter(osw); 

     int ch; 
     while ((ch = in.read()) > -1) { 
      out.write(ch); 
     } 

     out.close(); 
     in.close(); 
+2

संक्षेप में: ** इसे फ़ाइल के अपने एन्कोडिंग में पढ़ें और फिर ** इसे नए एन्कोडिंग में ** लिखें। – BalusC

14

निम्नलिखित कोड tgtEncoding को srcEncoding से एक फ़ाइल धर्मान्तरित:

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException { 
    BufferedReader br = null; 
    BufferedWriter bw = null; 
    try{ 
     br = new BufferedReader(new InputStreamReader(new FileInputStream(source),srcEncoding)); 
     bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding)); 
     char[] buffer = new char[16384]; 
     int read; 
     while ((read = br.read(buffer)) != -1) 
      bw.write(buffer, 0, read); 
    } finally { 
     try { 
      if (br != null) 
       br.close(); 
     } finally { 
      if (bw != null) 
       bw.close(); 
     } 
    } 
} 

--EDIT--

उपयोग करने का प्रयास-साथ-संसाधनों (जावा 7):

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException { 
    try (
     BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(source), srcEncoding)); 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding));) { 
      char[] buffer = new char[16384]; 
      int read; 
      while ((read = br.read(buffer)) != -1) 
       bw.write(buffer, 0, read); 
    } 
} 
+2

मेरी टिप्पणी को अनदेखा करें, आप सही हैं।बीटीडब्ल्यू ने आखिर में बंद होने की इस शैली को नहीं देखा है। चतुर। – BalusC

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