java의 디코딩 문제 요약 및 해결 방안

2308 단어 java뒤죽박죽
java의 디코딩 문제
최근에 프로젝트를 하면 자바에서 디코딩 문제가 자주 발생하기 때문에 시간을 내서 디코딩 문제가 발생하는 상황과 어떻게 처리하는지 정리했습니다.
분석
인코딩 및 디코딩
인코딩은 문자를 바이트로 바꾸는 것이고, 디코딩은 바이트를 문자로 바꾸는 것이다.
바이트 흐름과 문자 흐름
파일에 대한 읽기와 쓰기 작업은 모두 바이트 흐름을 통해 이루어집니다. JAVA에 문자 흐름이 있어도 그 밑에 있는 바이트 흐름을 사용합니다.
부호 문제가 발생하다
자바에서 가장 자주 사용하는 것은 문자입니다. 파일을 메모리에 읽고 컨트롤러에 표시할 때 (바이트 흐름 ---> 문자 흐름) 디코딩을 사용해야 합니다.만약 파일이 UTF-8 인코딩이고 우리가 디코딩할 때 GBK로 잘못 사용된다면(인코딩을 지정하지 않으면 JAVA는 시스템 기본 인코딩을 채택합니다), 디코딩만 표시할 수 있습니다.파일을 작성할 때 인코딩(UTF-8)을 지정하는 것이 좋습니다.
솔루션
예제 1
바이트 흐름을 문자 흐름으로 변환할 때, 우리는 인코딩 형식을 지정합니다.이건 우리 파일이고 gb2312 인코딩일 거예요.

public static String read(String filename) throws Exception {
    InputStream is = new FileInputStream(filename);
    BufferedReader in = new BufferedReader(new InputStreamReader(is,
        "gb2312"));           // 
    String s;
    StringBuilder sb = new StringBuilder();
    while ((s = in.readLine()) != null) {
      sb.append(s + "
"); } in.close(); return sb.toString(); }
예제 2
바이트를 통해 직접 읽어들이고 String을 사용하여 문자로 변환할 때 인코딩을 지정합니다.

package com.dy.xidian;

import java.io.FileInputStream;
import java.io.InputStream;

class BufferedInputFile {
  public static String read(String filename) throws Exception {
    @SuppressWarnings("resource")
    InputStream is = new FileInputStream(filename);

    byte[] b = new byte[1024];
    is.read(b);
    return new String(b, "gb2312");
  }
}

public class MemoryInput {
  public static void main(String[] args) throws Exception {
    String filename = "E:/html/gb2312.php";
    String s = BufferedInputFile.read(filename);
    System.out.println(s);
  }
}
트랩
입출력 작업에 FileReader 클래스가 있습니다. 이 클래스는 바이트 흐름이 문자 흐름으로 바뀌는 세부 사항을 숨깁니다. 우리는 이렇게 사용할 수 있습니다.BufferedReader in = new BufferedReader(new FileReader(filename)); 이렇게 하면 우리가 직접 얻는 것은 문자 흐름이다.그러나 우리는 인코딩을 설정하지 않았습니다. 이것은 FileReader에서 기본 인코딩 방식을 사용했기 때문입니다.이것은 매우 위험해진다. 만약 기본 인코딩 형식이 우리 파일의 인코딩과 다르다면, 읽은 데이터는 틀림없이 혼란스러울 것이다.그래서 우리는 예시의 방식으로 흐름의 전환을 하는 것이 가장 좋다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기