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;
}
}
}