admin

Java byte[] 编码识别
前言最近在做菟丝子资源社区这个项目的时候,TCP 接收到的种子文件信息,读取出来的数据发现有些编码是 UTF-8,...
扫描右侧二维码阅读全文
06
2019/03

Java byte[] 编码识别

前言

最近在做菟丝子资源社区这个项目的时候,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-8GBK两种。

于是后来终于找到一个比较好用的:cpdetector

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;
}
Last modification:March 6th, 2019 at 12:54 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment