दिलचस्प पोस्ट
कैसे एक सी मैक्रो के मूल्य से एक चार तार बनाने के लिए? event.target फ़ायरफ़ॉक्स पर काम नहीं कर रहा है Rails has_many: के माध्यम से खोजें विशेष गुणों में शामिल हों मॉडल में शामिल हों uiview की सीमा से परे बातचीत जेएस के साथ एक शरीर भारोत्तोलन घटना संलग्न करें एंड्रॉइड एप्लिकेशन के भीतर एक निष्पादन योग्य होस्टिंग MongoDB में सटीक तत्व सरणी में फ़ील्ड अपडेट करें Vim में टेक्स्ट चिपकाने पर ऑटो इंडेंट बंद करना Layout_gravity प्रोग्राम को कैसे सेट करें? मैं रूटरलिंक विशेषता को सशर्त अक्षम कैसे कर सकता / सकती हूं? विंडोज़ या लिनक्स के तहत क्यूटी 5 कैसे संकलित करें, 32 या 64 बिट, वीएस -2010, वीएस2012, वीएस2013 या वीएस2015 एक्सप्रेस या जी ++ पर स्थिर या गतिशील नेस्टेड ऑब्जेक्ट्स को कैसे पूछें? पायथन में पास वक्तव्य का उपयोग कैसे करें यूपीएसईआरटी कैसे करें ताकि मैं अद्यतन भाग में दोनों नए और पुराने मूल्यों का उपयोग कर सकूं सी # थ्रेड टर्मिनेशन और थ्रेड। एबर्ट ()

यूटीएफ -8 – बीओएम पढ़ना

मैं एक फ़ाइल रीडर के माध्यम से एक फ़ाइल पढ़ रहा हूं- फाइल यूटीएफ -8 डीओकोड है (बीओएम के साथ) अब मेरी समस्या है: मैंने फाइल पढ़ी और एक स्ट्रिंग आउटपुट की, लेकिन दुर्भाग्य से BOM मार्कर भी आउटपुट हुआ है। ऐसा क्यों होता है?

fr = new FileReader(file); br = new BufferedReader(fr); String tmp = null; while ((tmp = br.readLine()) != null) { String text; text = new String(tmp.getBytes(), "UTF-8"); content += text + System.getProperty("line.separator"); } 

पहली पंक्ति के बाद आउटपुट

 ?<style> 

वेब के समाधान से एकत्रित समाधान "यूटीएफ -8 – बीओएम पढ़ना"

जावा में, यदि आपको वर्तमान में यूटीएफ 8 बीओएम मैन्युअल रूप से उपभोग करना है। यह व्यवहार जावा बग डेटाबेस में, यहां और यहां दर्ज़ किया गया है । अभी कोई फ़िक्स नहीं होगा क्योंकि यह मौजूदा उपकरण जैसे जावाडाक या एक्सएमएल पार्सर को तोड़ देगा। अपाचे आईओ कॉमन्स इस स्थिति को संभालने के लिए एक BOMInputStream प्रदान करता है।

इस समाधान पर एक नज़र डालें: BOM के साथ यूटीएफ 8 फाइल को संभाल लें

सबसे आसान फिक्स शायद स्ट्रिंग से परिणामस्वरूप \uFEFF निकालने के लिए है, क्योंकि यह किसी भी अन्य कारण के लिए प्रकट होने की संभावना नहीं है।

 tmp = tmp.replace("\uFEFF", ""); 

इसके अलावा यह अमरूद बग रिपोर्ट भी देखें

अपाचे कॉमन्स लाइब्रेरी का उपयोग करें

कक्षा: org.apache.commons.io.input.BOMInputStream

उदाहरण उपयोग:

 String defaultEncoding = "UTF-8"; InputStream inputStream = new FileInputStream(someFileWithPossibleUtf8Bom); try { BOMInputStream bOMInputStream = new BOMInputStream(inputStream); ByteOrderMark bom = bOMInputStream.getBOM(); String charsetName = bom == null ? defaultEncoding : bom.getCharsetName(); InputStreamReader reader = new InputStreamReader(new BufferedInputStream(bOMInputStream), charsetName); //use reader } finally { inputStream.close(); } 

यहां बताया गया है कि मैं अपाचे BOMInputStream का उपयोग कैसे करता हूं, यह संसाधन-सह-संसाधन ब्लॉक का उपयोग करता है "झूठे" तर्क निम्नलिखित बमों को अनदेखा करने के लिए वस्तु को बताता है (हम सुरक्षा कारणों से "बीओएम-कम" टेक्स्ट फाइलों का उपयोग करते हैं, हहा):

 try( BufferedReader br = new BufferedReader( new InputStreamReader( new BOMInputStream( new FileInputStream( file), false, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_32BE, ByteOrderMark.UTF_32LE ) ) ) ) { // use br here } catch( Exception e) } 

यहां बताया गया है कि यह आम तौर पर विंडोज़ की फाइलों में एक समस्या है

एक संभव समाधान फ़ाइल को एक उपकरण जैसे dos2unix पहले चलाना होगा।

अपाचे कॉमन्स आईओ का उपयोग करें

उदाहरण के लिए, चलिए मेरे कोड पर एक नज़र डालें (लैटिन और साइरिलिक दोनों अक्षरों के साथ एक पाठ फ़ाइल पढ़ने के लिए उपयोग किया जाता है):

 String defaultEncoding = "UTF-16"; InputStream inputStream = new FileInputStream(new File("/temp/1.txt")); BOMInputStream bomInputStream = new BOMInputStream(inputStream); ByteOrderMark bom = bomInputStream.getBOM(); String charsetName = bom == null ? defaultEncoding : bom.getCharsetName(); InputStreamReader reader = new InputStreamReader(new BufferedInputStream(bomInputStream), charsetName); int data = reader.read(); while (data != -1) { char theChar = (char) data; data = reader.read(); ari.add(Character.toString(theChar)); } reader.close(); 

परिणामस्वरूप हमारे पास "एआरआई" नामक एक ArrayList है, जिसमें सभी वर्णों के साथ "1.txt" फ़ाइल को छोड़कर BOM को छोड़कर।

तो मैं इस रीडर उपवर्ग के साथ आया था

 /* * Copyright (C) 2016 donizyo * */ package net.donizyo.io; public class BOMReader extends BufferedReader { public static final String DEFAULT_ENCODING = "UTF-8"; public BOMReader(File file) throws IOException { this(file, DEFAULT_ENCODING); } private BOMReader(File file, String encoding) throws IOException { this(new FileInputStream(file), encoding); } private BOMReader(FileInputStream input, String encoding) throws IOException { this(new BOMInputStream(input), encoding); } private BOMReader(BOMInputStream input, String encoding) throws IOException { super(new InputStreamReader(input, getCharset(input, encoding))); } private static String getCharset(BOMInputStream bomInput, String encoding) throws IOException { ByteOrderMark bom; bom = bomInput.getBOM(); return bom == null ? encoding : bom.getCharsetName(); } } 

सबसे आसान तरीका मुझे बीओएम को बायपास करने के लिए मिला

 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); while ((currentLine = br.readLine()) != null) { //case of, remove the BOM of UTF-8 BOM currentLine = currentLine.replace("",""); 

सुनिश्चित नहीं है कि आप क्या सोचते हैं कि आप tmp.getBytes () और "UTF-8" आदि के साथ प्राप्त कर रहे हैं।

मुझे पूरा यकीन है कि जावा बीओएम का समर्थन नहीं करता है, यद्यपि मुझे यह दस्तावेज नहीं मिल रहा है जो अभी कहता है।

यह भी ध्यान देने योग्य है कि यूटीएफ -8 में BOMs अर्थहीन हैं , क्योंकि हार्डवेयर मानक के बाइट आदेश को निर्दिष्ट करता है। इसलिए यदि आप उन्हें पहले स्थान पर उत्पन्न होने से रोक सकते हैं, तो इससे मदद मिल सकती है