자바 인코딩 관련 문제 종합 정리

* 개요

 

- 자바에서 EUC-KR 과 UTF-8 을 사용시 비교함.

 

- 인코딩에 관한 기본 개념은 생략

 

- 몇년전에도 정리했었고, 어떻게 보면 뻔한 내용이지만 헷갈릴때가 많아서

(또는 모르는데 그냥 때려 맞춰서 쓰다보니) 정리함

 

- '인코딩' 이란 말이 

"File system 에 저장되는 방식" 일 수도 있고

"특정 툴에서 파일을 읽어 오거나, 문자를 다루는 방식" 일 수도 있고

"인코딩 방식을 다른 인코딩 방식으로 바꾸는 과정(인코딩 변환)" 일 수도 있다는 점에 유의해야 함.

 

 

 

* 환경

Eclipse 

 

 

 

* 참고 

"안녕" 이라는 한글을 다음 코드로 byte 로 나눠 출력하면 

String sHi = "안녕";

 

for(byte b : sHi.getBytes()) {

System.out.println(b);

}

 

 

euc-kr의 경우

-66 -56 -77 -25 

 

utf-8 의 경우

-20 -107 -120 -21 -123 -107  

 

 

 

* 이클립스 현재 Workspace 의 인코딩 바꾸는 방법

(상단메뉴)Window -> Preferences -> General(탭) -> Workspace

 

 

- 윈도우즈 기본값은 MS949

- 이건 '읽어오는 방법' 임. (이하 동일)
이미 UTF-8로 작성된 걸 EUC-KR 로 바꾸는 개념과는 다름.

- 기타 클래스 파일 등 인코딩

http://programmingskills.net/archives/536

 

 

* Project 의 인코딩 변경

(Project Explorer)프로젝트 이름 위에서 우클릭 -> Properties -> Resource(탭)

별 다른 설정 없으면 Workspace의 것을 따름

 

 

 

* 현재 Java 파일에서 인코딩 변경

(Project Explorer)Java 파일 이름 위에서 우클릭 -> Properties  -> Resource(탭)

별 다른 설정 없으면 Project의 것을 따름

 

 

 

* 현재 작업하면서 사용하는 인코딩은 workspace, project 무관하게 Java 파일의 것을 따름.

Workspace와 project 가 euc-kr 이라더라도

현재 Java 파일에서 UTF-8 을 사용한다면 UTF-8 을 따름.

 

 

String sHi = "안녕";

다음 코드가 포함된 abc.java 파일을 저장한다면 "안녕" 부분은

utf-8 (-20 으로 시작..) 로 저장되는 것.

 

 

* String#getBytes(); 는 현재 Java 파일의 인코딩을 따름.

화면에는 "안녕"으로 똑같이 보이더라도

 

똑같이 getBytes() 를 실행하면 

Java 파일이 UTF-8 일때는 20 -107 -120 -21 -123 -107   

Java 파일이 EUC-KR 일때는 66 -56 -77 -25  

 

출력됨.

 

 

 

* 그러면 서로 인코딩이 다른 java 파일끼리 호출하면?

 

- 인코딩 방식이 EUC-KR 인 'A' 파일에 다음 코드가 있다.

public void run() {

   String s = "안녕euc";

System.out.println(s);

}

 

 

UTF-8 인 'B' 파일에서 

'안녕' 을 출력하고

A를 호출하면??

             // 1. UTF-8

String sHi = "안녕utf";

System.out.println(sHi);

 

for(byte b : sHi.getBytes()) {

System.out.println(b);

}

 

// 2. 외부의 EUC-KR

new A().run();

 

안녕utf

-20

...(생략)

안녕euc

-20

...(생략)

 

 

둘 다 실행하는 측인 UTF-8 byte 값 기준으로 나옴.

 

A 의 "안녕"은 파일 저장시는 euc-kr 로 저장되겠지만

동작시에는 String으로 정상 인식되었고,

getBytes() 실행시에는 실행 기준인 UTF-8 을 따르는 것.

 

 

 

 

* Java 파일 UTF-8 상태일때 getBytes("EUC-KR") 을 실행하면?

현재 Java 파일 인코딩이 UTF-8 이라도 

EUC-KR 값인  66 -56 -77 -25  

이 출력됨.

 

즉, String 은 byte 값을 가지는게 아니라 "안녕"이란 문자 중심으로 다뤄지는것.

getBytes() 그냥 실행하면 현재 

getBytes(인코딩) 하면 해당 인코딩의 byte 값으로 반환해줌.

 

 

* 따라서 String 생성시 같은 문자에 대해서는 인코딩을 바꾸는게 큰 의미는 없음.

   String sHi = new String("안녕".getBytes("utf-8"), "utf-8");

String sHi2 = new String( "안녕".getBytes("euc-kr"), "euc-kr");

 

System.out.println(sHi);

System.out.println(sHi);

System.out.println(sHi.equals(sHi2));

 

두 String 은 다른 인코딩으로 생성했으니 다를까?

equals() 로 비교하면 true 임. 코드값이 중요한게 아니라 

눈에 보이는 "안녕"이란 문자열이 같으므로 같은 String 임

 

현재 String 을 euc-kr 로 바꿀거라며 

new String( "안녕".getBytes(), "euc-kr");

이런식으로 하면 (utf-8 상태였다면) 깨지는 일 밖에 안 남음.

 

 

 

* 그러므로 String 클래스 이용하여 같은 문자열의 다른 인코딩 값을 구하는 것은 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

getBytes(인코딩) 사용해서 간단히 할 수 있음.

 

 

 

* Java 파일이 실제 File system(하드 디스크) 에 저장될 때는 현재 설정 인코딩을 따름.

따라서 UTF-8 설정 상태에서 "안녕" 입력되어 있다면

String 객체야 이걸 euc-kr 이든 utf-8 이든 가져오는게 가능하지만

파일에 저장되는 건 현재 Java 파일 속성 설정에 따라 UTF-8 의 값인

-20 -107 -120 -21 -123 -107  

로 저장될 것.

 

- 이때 UTF-8 이었던 Java 파일의 인코딩 설정을 euc-kr 로 바꾸면

"����".

위와 같이 깨짐

다시 UTF-8로 바뀌면 돌아감.

 

 

- EUC-KR 이었던 "안녕" 을 UTF-8 로 저장하면

"�ȳ�"

 

위와 같이 깨짐

EUC-KR 로 바꾸면 돌아감.

 

 

 

- "안녕"(utf-8) 을 "안녕"(euc-kr)로 바꿔서 저장하는 효과 같은건 일어나지 않음. 

- 저장된 파일은 그대로이고, '읽어오는 방식' 만 바뀌는 거라 손실이 없음.

 

 

 

* 하나의 java 파일에 서로 다른 인코딩의 문자가 저장된다면?

 

 

다음과 같은 실험을 해보자.

 

1. java 파일 utf-8 설정 상태에서 "안녕" 을 입력

2. java 파일 의 인코딩을 euc-kr 로 바꿈.

=> 그러면 먼저 입력해놓은 "안녕"(utf-8) 은 깨지겠지

 

 

 

3. 그 상태에서 저장하려고 하면?

이클립스가 저장시에는 하나의 인코딩을 자동으로 인식하여 저장하는데, 

euc-kr 과 utf-8 이 동시에 보이니 

"UTF-8로 저장할거냐" 고 물어봄.

 

 

 

 

저장하게되면 UTF-8로 저장되는 것.

EUC-KR 의 상태에서 저장하려고 했었지만,Java 파일의 인코딩도 UTF-8로 다시 바뀜

 

- 이렇게 되면 utf-8로 저장했다가 euc-kr 로 바꾸면서 깨졌던 문자(sUtf)는 복구되지 않음

euc-kr 상태에서 입력했으나 결국 Save as UTF-8로 저장했던 문자(sEuc) 는 UTF-8 로 정상 저장됨.

 

현재 상태는 UTF-8 이니 EUC-KR 로 바꾼다고 sUtf 가 복구될 수는 없음.

 

 

이렇게 인코딩을 혼용하여 저장하는 과정에서 문자가 깨질 수 있음.

 

 

 

* 그럼 euc-kr로 저장된 java 파일을 utf-8로 다시 바꾸면?

 

"안녕" 은 다음과 같이 바뀌어 보임.

 

String s = "�ȳ�euc";

 

 

이때 utf-8로 바뀐 자바 파일 설정을 euc-kr 로 바꾸면 "안녕" 글자가 살아남.

즉 euc-kr 을 utf-8로 바꿀때는 손실이 없었음.

 

 

 

* 그러면 한번 설정된 Java 파일의 인코딩을 변경할 수는 없나?

 

- 이클립스에서 하는 방법 (EUC-KR => UTF-8)

위에 서술했듯 인코딩 설정 바꾼다고 바뀌는건 아님.

 

1. UTF-8 로 새로운 Java 파일을 하나 생성

2. EUC-KR(원본) 의 내용을 블럭 씌워서 복사 (Ctrl + C)

3. 새로 만들어놓은 UTF-8 파일에 붙임.

 

바이트 중심이 아니라 문자 중심으로 복사 되어 

서로 다른 인코딩 파일에도 한글 깨지지 않고 무사히 들어감.

 

 

- 에디트 플러스 에서 바꾸는 방법

https://mainia.tistory.com/3055

 

 

- "인코딩을 바꾼다" 는 말이 

이클립스 Project 상의 Java파일을 어떤 인코딩으로 인식할지에 대한 설정을 바꾸는 건지

아니면 실제 File system 에 저장되는 인코딩 방식을 바꾸는 건지 

에 대해 명확하지 않으면 혼동할 수 있음.

 

 

 

* HTML 파일 인코딩 관련사항.

 

프로젝트에 포함되지 않은 HTML 파일은 

File인코딩 정보를 볼 수 없음. (File -> Properties 가 불가능함.)

 

즉 이클립스 자체에서 인코딩에 대한 정보를 가지고 있지 않으며, 

<meta> 태그로 지정한 contentType에서의 charSet 정보로 인코딩 정보를 파악하여 IDE에서 보여주는것...

 

 문제는, 프로젝트에서 불러올 수도 있고, 윈도우즈 파일탐색기에서 이클립스를 이용하여 불러올 수도 있는데, 경우에 따라서 meta태그에 따라 읽는 경우도 있고, 프로젝트 인코딩 설정에 맞출수도 있다는것.

 

이 과정에서 혼란은 가중됨..

 

- HTML같은경우 meta 태그에서 지정한것과 무관하게 브라우저에서 자동으로 인코딩(첫번째) 해주는 일이 많기때문에 본인이 편집한 문서가 어떤 인코딩 타입을 썼는지 모르는 경우가 있을 수 있음.

 

이클립에서 html을 생성한다면 이클립스 환경에 따라 인코딩 타입이 결정되는 것이며, 

 

만약 utf-8의 이클립스 환경에서 meta 태그에 euc-kr이라고 적어놓고, 브라우저에서 돌려봐도 정상적으로 돌아가니까 이 html파일은 euc-kr 인코딩이 되어있구나 생각할 수도 있다는것.

 

 

 

 

* JSP 인코딩

JSP 의 인코딩, 톰캣의 인코딩 방식에 대한 구별이 필요

 

https://fruitdev.tistory.com/64

https://okky.kr/article/284291

 

 

* URLEncoder 사용 결과 - String 과 다르지 않아

"안녕"

 

// UTF-8

%EC%95%88%EB%85%95

 

// EUC-KR

%BE%C8%B3%E7

 

 

* DB의 CHARSET 이 latin1 일때 한글을 저장하는 방법

 

https://nomore7.tistory.com/entry/JAVA-Encoding-%EA%B3%BC-Decoding%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC

 



출처: https://dogcowking.tistory.com/289 [dogcowking]

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
161 [Java 자료구조] JPA와 Spring Data JPA의 차이 file 졸리운_곰 2022.09.09 30
160 [java 자료구조] 하이버네이트 쉽게 입문하기 (기초)-환경설정,입력조회 개발 file 졸리운_곰 2022.09.09 22
159 [Java 자료구조] JPA, Hibernate, 그리고 Spring Data JPA의 차이점 졸리운_곰 2022.09.09 23
158 [Java][MyBatisc] myBatis에서 null과 nullString을 체크할 때 졸리운_곰 2021.09.13 33
157 [MongoDB/Java] MongoDB에 JSON 형식 데이터 삽입하기 file 졸리운_곰 2021.07.13 27
156 [Java, MongoDB] mongodb java driver 3.0: how to store JSON document 졸리운_곰 2021.07.13 30
155 [Java 자료구조] [Java] 문자열의 첫 글자 제거 졸리운_곰 2021.05.24 406
154 [Java 자료구조] [java] 특정 문자열 사이의 문자열 추출하기, 정규식 졸리운_곰 2021.05.24 1875
153 [Java 자료구조] [JAVA] Java언어로 JSON 생성, 파싱 예제 file 졸리운_곰 2021.05.17 19
152 [Java 자료구조] [Java] Immutable Class (불변 클래스) file 졸리운_곰 2021.03.07 26
151 [Java 자료구조] 불변 객체란? Java Immutable Object file 졸리운_곰 2021.03.07 48
150 [Java 자료구조] [Java] Immutable Object(불변객체) 졸리운_곰 2021.03.07 44
149 [java 자료구조] Oracle + Mybatis 환경에서의 Date 다루기 졸리운_곰 2021.02.25 57
148 Java JSON library Jackson Date Date Json 시리얼라이즈/디씨리얼라이즈 file 졸리운_곰 2021.02.25 28
147 [Java, JSON, jackson] Ignoring new fields on JSON objects using Jackson 졸리운_곰 2021.02.19 16
146 [Java] [Jackson] JsonInclude 속성에 대해 알아보자. 졸리운_곰 2021.02.03 592
145 [java] [jackson] Map - JSON간 변환 졸리운_곰 2021.02.02 41
144 [java] [자료구조] Remove null values from json using jackson 졸리운_곰 2021.02.02 78
» 자바 인코딩 관련 문제 종합 정리 file 졸리운_곰 2021.01.29 40
142 [Java 디자인패턴] [JAVA 디자인 패턴] static을 응용한 싱글톤 패턴(Singleton Pattern) 구현 졸리운_곰 2021.01.22 20
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED