import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.mozilla.universalchardet.UniversalDetector;
/**
* 字符集工具类,提供了检测字符集的工具方法
* 首先当然是使用mozilla的开源工具包universalchardet进行字符集检测,对于检测失败的,使用中文常用字进行再次检测
* @date 2015年4月21日下午5:24:30
*/
public class CharsetUtils {
/**
* 中文常用字符集
*/
public static final String[] AVAILABLE_CHINESE_CHARSET_NAMES = new String[] { "GBK", "gb2312", "GB18030", "UTF-8", "Big5" };
/**
* 中文常用字
*/
private static final Pattern CHINESE_COMMON_CHARACTER_PATTERN = Pattern.compile("的|一|是|了|我|不|人|在|他|有|这|个|上|们|来|到|时|大|地|为|子|中|你|说|生|国|年|着|就|那|和|要");
public static Charset detect(byte[] content) {
String charset = universalDetect(content);
if (charset != null && !charset.isEmpty()) {
return Charset.forName(charset);
}
int longestMatch = 0;
for (String cs : AVAILABLE_CHINESE_CHARSET_NAMES) {
String temp = new String(content, Charset.forName(cs));
Matcher matcher = CHINESE_COMMON_CHARACTER_PATTERN.matcher(temp);
int count = 0;
while (matcher.find()) {
count += 1;
}
if (count > longestMatch) {
longestMatch = count;
charset = cs;
}
}
return charset == null ? Charset.forName("GB18030") : Charset.forName(charset);
}
/**
* 使用mozilla的开源工具包universalchardet进行字符集检测,不一定能完全检测中文字符集
*/
public static String universalDetect(byte[] content) {
UniversalDetector detector = new UniversalDetector(null);
detector.handleData(content, 0, content.length);
detector.dataEnd();
return detector.getDetectedCharset();
}
}
Java字符集检测,更好的支持中文字符集
最新推荐文章于 2024-09-14 09:17:14 发布