All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.minidev.net.EncodingCorrector Maven / Gradle / Ivy

The newest version!
package net.minidev.net;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.TreeSet;

public class EncodingCorrector {
	private final static Charset ENC_LATIN1 = Charset.forName("ISO-8859-1");
	// private final static Charset ENC_LATIN15 =
	// Charset.forName("ISO-8859-15");
	private final static Charset ENC_UTF8 = Charset.forName("UTF-8");

	private static int countChar(String text, char ch) {
		int count = 0;
		int length = text.length();
		for (int i = 0; i < length; i++)
			if (text.charAt(i) == ch)
				count++;
		return count;
	}

	public static boolean haveInvalidUtf8(String text) {
		int length = text.length();
		for (int i = 0; i < length; i++)
			if (text.charAt(i) == (char) 65533)
				return true;
		return false;
	}

	public static String dropInvalidUtf8(String text) {
		if (text == null)
			return null;
		return text.replace("\uFFFD", "");
	}

	/**
	 * Correct Invalid Encodage
	 */
	public static String fixEncodage(final String text) {
		int bugUTF8 = countChar(text, (char) 65533);
		if (bugUTF8 > 0)
			// bug can not be Fixed.
			// Data Lost
			return text;

		TreeSet errors = getLatin1Errors(text);

		if (errors == null)
			return text;

		String fixed = readAsUTF8(text);
		bugUTF8 = countChar(fixed, (char) 65533);
		if (bugUTF8 == 0)
			return fixed;

		fixed = text;
		// try to Fix Error by Hand
		if (errors != null)
			for (String s : errors) {
				String sf = readAsUTF8(s);
				bugUTF8 = countChar(sf, (char) 65533);
				fixed = fixed.replace(s, sf);
			}
		bugUTF8 = countChar(fixed, (char) 65533);
		if (bugUTF8 == 0)
			return fixed;
		return text;
	}

	public static int getLatin1ErrorCount(String text) {
		TreeSet errors = getLatin1Errors(text);
		if (errors == null)
			return 0;
		return errors.size();
	}

	public static int countNonAsciiChar(String text) {
		int c = 0;
		int l = text.length();
		for (int i = 0; i < l; i++) {
			char ch = text.charAt(i);
			if (ch < 0 || ch > 127)
				c++;
		}
		return c;
	}

	public static char getFirstNonAsciiChar(String text) {
		int l = text.length();
		for (int i = 0; i < l; i++) {
			char ch = text.charAt(i);
			if (ch < 0 || ch > 127)
				return ch;
		}
		return 0;
	}

	private static TreeSet getLatin1Errors(String text) {
		TreeSet errors = null;
		for (int i = 0; i < text.length() - 1; i++) {
			String key = text.substring(i, i + 2);
			if (!latinError.contains(key))
				continue;
			// bugLatin++;
			if (errors == null) {
				errors = new TreeSet();
			}
			errors.add(key.intern());
		}
		return errors;
	}

	public static String readAsUTF8(String text) {
		if (text == null)
			return null;
		return new String(text.getBytes(ENC_LATIN1), ENC_UTF8);
	}

	public static String cleanHtmlChars(String text) {
		int change = 0;
		StringBuilder sb = new StringBuilder(text.length());
		for (int i = 0; i < text.length(); i++) {
			String key = text.substring(i, i + 1);
			String html = htmlEncode.get(key);
			if (html != null) {
				change++;
				sb.append(html);
			} else {
				sb.append(key);
			}
		}
		if (change > 0)
			text = sb.toString();
		return text;
	}

	static HashSet latinError;
	static Hashtable htmlEncode;
	// static Hashtable ErrorIndex;

	static ArrayList ces;
	static {
		latinError = new HashSet();
		htmlEncode = new Hashtable();
		ces = new ArrayList();
		add(new CommonError(160, "&nbps;")); //  
		add(new CommonError(161, "¡")); // ¡
		add(new CommonError(162, "¢")); // ¢
		add(new CommonError(163, "£")); // £
		// add(new CommonError(164, "¤")); // ¤
		add(new CommonError(164, "€")); // ¤
		add(new CommonError(165, "¥")); // ¥
		add(new CommonError(166, "¦")); // ¦
		add(new CommonError(167, "§")); // §
		add(new CommonError(168, "¨")); // ¨
		add(new CommonError(169, "©")); // ©
		add(new CommonError(170, "ª")); // ª
		add(new CommonError(171, "«")); // «
		add(new CommonError(172, "¬")); // ¬
		add(new CommonError(173, "­")); // ­
		add(new CommonError(174, "®")); // ®
		add(new CommonError(175, "&masr;")); // ¯
		add(new CommonError(176, "°")); // °
		add(new CommonError(177, "±")); // ±
		add(new CommonError(178, "²")); // ²
		add(new CommonError(179, "³")); // ³
		add(new CommonError(180, "´")); // ´
		add(new CommonError(181, "µ")); // µ
		add(new CommonError(182, "¶")); // ¶
		add(new CommonError(183, "·")); // ·
		add(new CommonError(184, "¸")); // ¸
		add(new CommonError(185, "¹")); // ¹
		add(new CommonError(186, "º")); // º
		add(new CommonError(187, "»")); // »

		add(new CommonError(188, "¼")); // ¼
		add(new CommonError(189, "½")); // ½
		add(new CommonError(190, "¾")); // ¾

		add(new CommonError(191, "¿")); // ¿

		add(new CommonError(192, "À")); // À
		add(new CommonError(193, "Á")); // Á
		add(new CommonError(194, "Â")); // Â
		add(new CommonError(195, "Ã")); // Ã
		add(new CommonError(196, "Ä")); // Ä
		add(new CommonError(197, "Å")); // Å
		add(new CommonError(198, "&Aelig")); // Æ
		add(new CommonError(199, "Ç")); // Ç
		add(new CommonError(200, "È")); // È
		add(new CommonError(201, "É")); // É
		add(new CommonError(202, "Ê")); // Ê
		add(new CommonError(203, "Ë")); // Ë
		add(new CommonError(204, "Ì")); // Ì
		add(new CommonError(205, "Í")); // Í
		add(new CommonError(206, "Î")); // Î
		add(new CommonError(207, "Ï")); // Ï
		add(new CommonError(208, "Ð")); // Ð
		add(new CommonError(209, "Ñ")); // Ñ
		add(new CommonError(210, "Ò")); // Ò
		add(new CommonError(211, "Ó")); // Ó
		add(new CommonError(212, "Ô")); // Ô
		add(new CommonError(213, "Õ")); // Õ
		add(new CommonError(214, "Ö")); // Ö
		add(new CommonError(215, "×")); // ×
		add(new CommonError(216, "Ø")); // Ø
		add(new CommonError(217, "Ù")); // Ù
		add(new CommonError(218, "Ú")); // Ú
		add(new CommonError(219, "Û")); // Û
		add(new CommonError(220, "Ü")); // Ü
		add(new CommonError(221, "Ý")); // Ý
		add(new CommonError(222, "þ")); // Þ
		add(new CommonError(223, "ß")); // ß

		add(new CommonError(224, "à")); // à
		add(new CommonError(225, "á")); // á
		add(new CommonError(226, "â")); // â
		add(new CommonError(227, "ã")); // ã
		add(new CommonError(228, "ä")); // ä
		add(new CommonError(229, "å")); // å
		add(new CommonError(230, "æ")); // æ
		add(new CommonError(231, "ç")); // ç
		add(new CommonError(232, "è")); // è
		add(new CommonError(233, "é")); // é
		add(new CommonError(234, "ê")); // ê
		add(new CommonError(235, "ë")); // ë
		add(new CommonError(236, "&iagrave;")); // ì
		add(new CommonError(237, "í")); // í
		add(new CommonError(238, "â")); // î
		add(new CommonError(239, "&imul;")); // ï
		add(new CommonError(240, "ð")); // ð
		add(new CommonError(241, "ñ")); // ñ
		add(new CommonError(242, "ò")); // ò
		add(new CommonError(243, "ó")); // ó
		add(new CommonError(244, "ô")); // ô
		add(new CommonError(245, "õ")); // õ
		add(new CommonError(246, "ö")); // ö
		add(new CommonError(247, "÷")); // ÷
		add(new CommonError(248, "ø")); // ø
		add(new CommonError(249, "ù")); // ù
		add(new CommonError(250, "ú")); // ú
		add(new CommonError(251, "û")); // û
		add(new CommonError(252, "ü")); // ü
		add(new CommonError(253, "ÿ")); // ý
		add(new CommonError(254, "þ")); // þ
	}

	private static void add(CommonError ce) {
		ces.add(ce);
		latinError.add(ce.bugSymptom);
		htmlEncode.put(ce.correct, ce.html);
		htmlEncode.put(ce.correct, ce.html);
	}

	protected static class CommonError {
		int code;
		byte[] latin1;
		byte[] utf8;
		String correct;
		String bugSymptom;
		String html;

		public CommonError(int code) {
			this(code, "&#" + code + ";");
		}

		public CommonError(int code, String html) {
			this.code = code;
			this.latin1 = new byte[] { (byte) code };
			this.correct = new String(latin1, ENC_LATIN1).intern();
			this.utf8 = correct.getBytes(ENC_UTF8);
			this.bugSymptom = new String(utf8, ENC_LATIN1).intern();
			this.html = html;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy