Java 디 코딩

자바 코드 문제 에 대해 문자열 은 서버 기본 인 코딩 을 사용 하고 어떤 서버 는 GBK 를 사용 합 니 다.UTF-8 이 있 습 니 다.그렇다면 문자열 의 난 장 판 문 제 를 어떻게 피 할 수 있 습 니까?
문자열 오류 의 구체 적 인 원인
1)우선,명확 하 게 말하자면,난 코드 는 정확 한 지 정 된 인 코딩 형식 이 없 기 때 문 입 니 다.흔히 볼 수 있 는 인 코딩 형식 은 utf-8(UTF 8),GBK,GB 2312,ISO-8859-1 입 니 다.
2)그 다음으로 자바 의 문자열 인 코딩 은 유 니 코드 인 코딩 을 통일 적 으로 사용 합 니 다.문자열 에는 final char 배열 로 저장 되 어 있 으 며,각각 char 는 2 byte 를 가지 고 있 으 며,한 자 를 저장 할 수 있 습 니 다.
3)그 다음 에 자바 에서 인 코딩 형식 이 있 는 내용 을 문자열 로 저장 할 때 문자열 은 기본 적 인 디 코딩 을 하지 않 습 니 다.즉,문자열 에 전 달 된 내용 이 무엇 인지,문자열 에 저 장 된 내용 이 무엇 인지,그 는 자동 으로 디 코딩 을 하지 않 습 니 다!
4)마지막 으로 우리 가 사용 하면
 String.getBytes(charset);
그러면 문자열 의 내용 을 바 꿉 니 다.이 코드 는 문자열 의 원래 인 코딩 형식 을 지정 한 charset 인 코딩 형식 으로 바 꾸 는 것 을 의미 합 니 다.
하면,만약,만약...
 String.getBytes();
그러면 String.getBytes(System.getProperty("file.encoding")); 혹은 String.getBytes(Charset.defaultCharset().name());시스템 인 코딩 으로 전환 하 는 것 은 매우 위험 합 니 다.서로 다른 서버 시스템 인 코딩 이 다 르 기 때문에 이 서버 가 정상 적 이 고 다른 서버 는 난 장 판 입 니 다!
문자열 오류 해결:
1)String.getBytes()방법 을 사용 하지 말고 String.getBytes(charset)를 사용 하 십시오.이 charset 는 String 내용 의 인 코딩 형식 이 어야 합 니 다!
2)문자열 변환 은 new String(str1.getBytes(str1 charset),str2 charset)을 사용 합 니 다.마찬가지 로 지정 되 지 않 은 str2 charset 도 기본 시스템 인 코딩 을 사용 합 니 다!그러나 이것 은 new String(str)과 구별 해 야 합 니 다.그 는 사실 코드 를 바 꾸 지 않 았 습 니 다.소스 코드 에서 볼 수 있 습 니 다!
3)HttpURLConnection Post 매개 변 수 는 문자열 변환 에 사 용 됩 니 다.
  conn.setDoOutput(true);//       
  conn.getOutputStream().write(param.toString().getBytes());//     ,

    여기 서 시스템 기본 인 코딩 을 사용 하 는 것 은 사실 잘못된 것 입 니 다.왜냐하면 우 리 는 param 안의 내용 이 구체 적 으로 어떤 인 코딩 인지 모 르 기 때 문 입 니 다!
4)파일 을 읽 고 쓸 때 문자열 변환 을 사용 합 니 다.
   // 파일 내용 읽 기
   isr = new InputStreamReader(new FileInputStream(file),fileCharset);
   int length = -1 ;
   char[] buffer = new char[1024];
   StringBuffer sb = new StringBuffer();
   while((length = isr.read(buffer, 0, 1024) ) != -1){
    sb.append(buffer,0,length);
   }
   data = new String(sb);

    // 사람의 내용 을 쓰다
    osw = new OutputStreamWriter(new FileOutputStream(path),fileCharset);
    osw.write(new String(data.getBytes(charset1),charset2));
    osw.flush();

    파일 내용 을 읽 을 때 지정 한 파일 의 인 코딩 형식 을 통 해 읽 습 니 다.이 때 문자열 은 읽 은 내용 을 자동 디 코딩 처럼 저장 하지 않 기 때문에 문자열 에 저 장 된 내용 은 파일 의 인 코딩 형식 에 따라 인 코딩 됩 니 다.사실 여기 서 우 리 는 바이트 흐름 을 통 해 읽 고 문자열 을 지정 한 인 코딩 형식 으로 바 꿀 수 있 습 니 다.그 다음 에 내용 을 쓸 때 먼저 파일 의 인 코딩 형식 을 지정 한 다음 에 문자열 의 인 코딩 형식 을 설정 합 니 다.한 패 를 쓰 는 것 은 바이트 배열 이 고 바 이 트 는 어 지 러 운 코드 가 없 기 때문에 문자열 을 지정 한 인 코딩 형식의 바이트 배열 로 바 꿔 야 합 니 다.이때 data.getBytes()를 사용 하면 시스템 인 코딩 을 사용 하면 어 지 러 운 코드 가 발생 할 수 있 습 니 다!
5)GBK 시스템 에서 내용 이 UTF-8 인 코딩 이 라 고 가정 하고 new String(str.getBytes("utf-8"),"GBK")을 사용 한 다음 value.getByte()를 사용한다.코드 가 흐 트 러 지지 않 는 이 유 는 먼저 GBK 로 바 뀌 었 기 때 문 입 니 다.그 다음 에는 기본 값 이 GBK(시스템 인 코딩)에서 돌아 오고 마지막 에는 UTF-8 이기 때문에 흐 트 러 지지 않 습 니 다!
6)(자바 문자열)코드 는 내용 의 바이트 가 변 하지 않 고 인 코딩 형식의 요구 에 따라 바이트 에 대해 서로 다른 길이 의 분할 을 하 는 것 을 말한다.예 를 들 어 ISO-8859-1 은 하나의 바이트 이지 만 UTF-8 은 가 변 적 이기 때문에 UTF-8 을 ISO-8859-1 로 바 꾸 면 난동 이 발생 하지만 ISO-8859-1 에서 UTF-8 로 전환 하면 정상화 된다.그래서 여기 서 코드 를 바 꾸 는 것 은 우리 가 사용 하 는 그런 코드 바 꾸 는 도구 가 아니다!

좋은 웹페이지 즐겨찾기