रूपांतरण प्रक्रिया को सत्यापित करने का एक तरीका विशेष वर्णों के साथ गलत वर्णों को चुपचाप बदलने के बजाय त्रुटियों से बचने के लिए वर्णसेट डिकोडर और एन्कोडर को कॉन्फ़िगर करना है:
CharsetDecoder inDec=Charset.forName("windows-1252").newDecoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
CharsetEncoder outEnc=StandardCharsets.UTF_8.newEncoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
try(FileInputStream is=new FileInputStream(filepath);
BufferedReader reader=new BufferedReader(new InputStreamReader(is, inDec));
FileOutputStream fw=new FileOutputStream(destpath);
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(fw, outEnc))) {
for(String in; (in = reader.readLine()) != null; ) {
out.write(in);
out.newLine();
}
}
ध्यान दें कि आउटपुट एन्कोडर यहां समरूपता के लिए कॉन्फ़िगर किया गया है, लेकिन UTF-8
प्रत्येक यूनिकोड वर्ण को एन्कोड करने में सक्षम है, हालांकि, जब आप अन्य रूपांतरण करने के लिए उसी कोड का उपयोग करना चाहते हैं, तो इसे सममित करने से मदद मिलेगी।
इसके अलावा, ध्यान दें कि यह मदद नहीं करेगा यदि इनपुट फ़ाइल एक अलग एन्कोडिंग में है, लेकिन बाइट्स की गलत व्याख्या करने से वैध वर्ण बन जाते हैं। एक बात पर विचार करना है कि क्या इनपुट एन्कोडिंग "windows-1252"
वास्तव में सिस्टम के डिफ़ॉल्ट एन्कोडिंग का मतलब था (और क्या यह वास्तव में वही है)। यदि संदेह है, तो आप Charset.defaultCharset()
. का उपयोग कर सकते हैं इसके बजाय Charset.forName("windows-1252")
जब वास्तव में इच्छित रूपांतरण default
है → UTF-8
।