>  기사  >  Java  >  문자 세트 메소드를 자동으로 식별하려면 java.nio.charset.CharsetDecoder를 사용하십시오.

문자 세트 메소드를 자동으로 식별하려면 java.nio.charset.CharsetDecoder를 사용하십시오.

高洛峰
高洛峰원래의
2017-03-12 09:43:232254검색

이 글소개java.nio.charset.CharsetDecoder를 사용하여 문자 집합메서드

를 자동으로 식별하는 방법을 연구합니다. 인터넷에서 사용할 수 있습니다. 문자 집합을 자동으로 식별하는 가장 효과적인 방법은 타사 클래스 라이브러리 jchardet를 사용하는 것입니다. 실제로 jchardet을 사용하는 cpDetector도 있습니다. 우연히 jdk의 java.nio.charset.CharsetDecoder를 사용하여 문자 집합을 식별할 수 있다는 사실을 발견했습니다.

1. 원리

InputStreamReader를 구성하는 데는 일반적으로 두 가지 방법이 사용됩니다.

InputStreamReader reader = new InputStreamReader(in, charsetName);

or

InputStreamReader reader = new InputStreamReader(in, charset);

문자셋이 일치하지 않으면 깨져서 출력됩니다.

CharsetDecoder를 사용하는 구성 방법도 있습니다.

CharsetDecoder cd = charset.newDecoder();
InputStreamReader reader = new InputStreamReader(in, cd);

이때 일치하는 항목이 없으면 예외가 발생합니다:

java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:277)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:338)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
        ....

이런 방식으로 문자 집합 감지로 사용할 수 있습니다.

2. AutoCharsetReader 사용

AutoCharsetReader는 위의 원칙을 바탕으로 작성된 클래스이며 을 상속합니다. 🎜>Reader 는 Charset 적응형 InputStreamReader로 볼 수 있습니다.

AutoCharsetReader ar= new AutoCharsetReader(in);char c = ar.read();
...char[] cbuf = new char[2000];
ar.read(cbuf);
...
BufferedReader br = new BufferedReader(ar);
br.readLine();
...

또 다른 예는 Reader 매개변수가 필요한 전체 텍스트 index를 생성하는 Lucene의 TextField입니다. 이 클래스를 직접 사용할 수 있습니다.

Field field = new TextField("content", new AutoCharsetReader(file));

파일을 읽은 후 파일의 문자셋을 얻을 수 있습니다. 참고로 읽어본 후의 내용입니다.

Charset charset = ar.charset();

3. 대체 문자 집합

다중 시도 방식 때문에 문자 세트를 마무리하고 대안을 제공하십시오. 현재 코드에서 제공하는 기본 대체 문자 집합은 다음과 같습니다.

    private final static String[] _defaultCharsets = {        
            "US-ASCII",            "UTF-8",            "GB2312", 
            "BIG5",            "GBK",            "GB18030",                
            "UTF-16BE", 
            "UTF-16LE", 
            "UTF-16",            "UNICODE"};

대체 문자 집합을 변경하는 방법도 제공됩니다. 예:

AutoCharsetReader ar = new AutoCharsetReader(in).setCharset("ascii", "utf-8", "gbk");

순서는 감지 결과에 영향을 미칩니다. 예를 들어 GBK가 GB2312 이전인 경우 GBK에는 GB2312가 포함되어 있으므로 탐지 결과는 GBK만 가능하고 GB2312는 될 수 없습니다.

4. 문자 집합 감지 전용

은 문자 집합 감지에만 사용할 수 있습니다:

charset = AutoCharsetReader.quickDetect(file.toURI().toURL(), charsets);
or:
charset = AutoCharsetReader.deepDetect(file.toURI().toURL(), charsets, stops);

quickDetect는 한 문자만 읽으며 단일 문자 집합 파일에 적합합니다. html의 경우 문자셋을 알기 위해 모두 읽어야 할 수도 있으므로 deepDetect를 사용하세요. 문자 집합 매개변수는 null일 수 있습니다.

파일 집합의 경우 알려진 가능한 문자 집합은 "ascii", "utf-8", "gb2312" 및 "gbk"입니다. 파일의 문자 집합이 다음과 같은 것으로 감지되면 "utf-8" 또는 "gbk"인 경우 파일을 계속 읽지 않고도 결과가 즉시 반환될 수 있습니다. 이때 stops 매개변수를 {"utf-8", "gbk"}에 할당할 수 있습니다. null인 경우 모두 읽어야 합니다.

5. 기타

이 클래스에는 효율성을 높이기 위해 버퍼가 있습니다. io 를 다시 읽어야 합니다. 기본 버퍼 크기는 8192입니다. 객체를 구성할 때 버퍼 크기를 직접 정의할 수 있습니다. 매개변수가 16보다 작으면 16으로 설정하세요.


위 내용은 문자 세트 메소드를 자동으로 식별하려면 java.nio.charset.CharsetDecoder를 사용하십시오.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.