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

* 개요

 

- 자바에서 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]

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
35 [EMF] EMF Tutorial EMF 튜터리얼 file 졸리운_곰 2023.08.23 283
34 Eclipse RAP Tutorial for Beginners - Workbench Application (OLD) file 졸리운_곰 2021.01.30 323
33 Learn Eclipse GMF in 15 minutes file 졸리운_곰 2019.11.27 253
32 [Eclipse] GEF entry series (10, an implementation of the form) file 졸리운_곰 2019.11.25 212
31 GEF Programmer Guide 번역 졸리운_곰 2019.11.25 227
30 Learn Eclipse GMF in 15 minutes file 졸리운_곰 2019.11.20 224
29 RCP 에디터 정리 졸리운_곰 2019.11.20 333
28 다른 그림과 관련하여 GEF 편집기 레이아웃에서 그림의 위치 제한 조건을 동적으로 계산 Dynamically calculating the position constraints for a figure in a GEF editor layout in relation to another figure file 졸리운_곰 2019.11.20 277
27 RCP 등에서 .mf 파일로 다른 프로젝트 익스포트 포함시 라이브러리(메소드)를 찾지 못할 때, Eclipse RCP - cant resolve importing libraries in final build file 졸리운_곰 2019.10.15 410
26 ESE2006-EclipseModelingSymposium15_GMF.pdf file 졸리운_곰 2019.09.21 302
25 GMF_Creation_Review.pdf file 졸리운_곰 2019.09.21 366
24 Eclipse EMF and GMF Tutorial file 졸리운_곰 2019.09.21 222
23 GMF Tutorial/ko file 졸리운_곰 2019.09.20 347
22 Model Driven Architecture approach to domain of graphical editors file 졸리운_곰 2019.09.20 268
21 Single_Sourcing_RAP_RCP_en.pdf file 졸리운_곰 2019.05.15 311
20 Rich client platform 설명 및 배우기 참고 졸리운_곰 2019.05.15 309
19 Rich Ajax Platform, Part 1: 소개 file 졸리운_곰 2019.05.15 320
18 또 하나의 크로스 플랫폼: Eclipse RAP file 졸리운_곰 2019.05.15 319
17 Eclipse 4 RCP 튜토리얼(완료) file 졸리운_곰 2019.05.14 977
16 Updating UI in Eclipse RCP 졸리운_곰 2015.11.07 408
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED