जब मुझे इस तरह की समस्या थी, तो मैंने यह सुनिश्चित करने के लिए पर्ल स्क्रिप्ट का उपयोग किया कि डेटा इस तरह के कोड का उपयोग करके वैध यूटीएफ -8 में परिवर्तित हो गया है:
use Encode;
binmode(STDOUT, ":utf8");
while (<>) {
print Encode::decode('UTF-8', $_);
}
यह स्क्रिप्ट (संभवतः दूषित) UTF-8 को stdin
. पर लेती है और मान्य UTF-8 को stdout
. पर फिर से प्रिंट करता है . अमान्य वर्णों को �
. से बदल दिया गया है (U+FFFD
, यूनिकोड रिप्लेसमेंट कैरेक्टर
)।
यदि आप इस स्क्रिप्ट को अच्छे UTF-8 इनपुट पर चलाते हैं, तो आउटपुट इनपुट के समान होना चाहिए।
यदि आपके पास डेटाबेस में डेटा है, तो यह सुनिश्चित करने के लिए कि सब कुछ मान्य UTF-8 है, अपनी तालिका (तालिकाओं) को स्कैन करने और इस दृष्टिकोण का उपयोग करके सभी डेटा को साफ़ करने के लिए DBI का उपयोग करना समझ में आता है।
यह इसी स्क्रिप्ट का पर्ल वन-लाइनर संस्करण है:
perl -MEncode -e "binmode STDOUT,':utf8';while(<>){print Encode::decode 'UTF-8',\$_}" < bad.txt > good.txt
संपादित करें:केवल जावा समाधान जोड़ा गया ।
यह एक उदाहरण है कि इसे जावा में कैसे करें:
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
public class UtfFix {
public static void main(String[] args) throws InterruptedException, CharacterCodingException {
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
decoder.onMalformedInput(CodingErrorAction.REPLACE);
decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
ByteBuffer bb = ByteBuffer.wrap(new byte[] {
(byte) 0xD0, (byte) 0x9F, // 'П'
(byte) 0xD1, (byte) 0x80, // 'р'
(byte) 0xD0, // corrupted UTF-8, was 'и'
(byte) 0xD0, (byte) 0xB2, // 'в'
(byte) 0xD0, (byte) 0xB5, // 'е'
(byte) 0xD1, (byte) 0x82 // 'т'
});
CharBuffer parsed = decoder.decode(bb);
System.out.println(parsed);
// this prints: Пр?вет
}
}