이 글소개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 중국어 웹사이트의 기타 관련 기사를 참조하세요!