Java byte[] 编码识别 时间: 2019-03-06 00:54 分类: 修仙日记,JAVA ####前言 最近在做[菟丝子资源社区][1]这个项目的时候,TCP 接收到的种子文件信息,读取出来的数据发现有些编码是 UTF-8,有些是 GBK,如果不做判断的话,那么在 JAVA 中直接`new String(buff)`有些是会乱码的。 最开始找到的是使用`juniversalchardet.jar`这个工具包,但是发现乱码依旧,特意找了一个`GBK`编码的种子文件测试,发现识别出来的结果竟然是`null`。 搜索了一番,发现它支持识别的编码类型如下: - Chinese - ISO-2022-CN - BIG5 - EUC-TW - GB18030 - HZ-GB-23121 - Cyrillic - ISO-8859-5 - KOI8-R - WINDOWS-1251 - MACCYRILLIC - IBM866 - IBM855 - Greek - ISO-8859-7 - WINDOWS-1253 - Hebrew - ISO-8859-8 - WINDOWS-1255 Japanese - ISO-2022-JP - SHIFT_JIS - EUC-JP Korean - ISO-2022-KR - EUC-KR - Unicode - UTF-8 - UTF-16BE / UTF-16LE - UTF-32BE / UTF-32LE / X-ISO-10646-UCS-4-34121 / X-ISO-10646-UCS-4-21431 Others - WINDOWS-1252 发现,居然没有`GBK`或者`GB2312`,难怪识别不出来,网上还那么多人说这个好用,对于中国来说,识别不出`GBK`编码还能拿来干嘛,网页上主要就是`UTF-8`与`GBK`两种。 于是后来终于找到一个比较好用的:cpdetector ```java public static CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance(); static { detector.add(new ParsingDetector(false)); detector.add(JChardetFacade.getInstance()); detector.add(ASCIIDetector.getInstance()); detector.add(UnicodeDetector.getInstance()); } public static String getEncoding(byte[] bytes) { String defaultEncoding = "UTF-8"; try(ByteArrayInputStream in = new ByteArrayInputStream(bytes)) { java.nio.charset.Charset charset = detector.detectCodepage(in, bytes.length); defaultEncoding = charset.name(); } catch (IOException e) { } return defaultEncoding; } ``` [1]: http://dodder.cc 标签: 无