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

* 개요

 

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

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
18 [java 인공지능] Spring AI 로 ChatGPT API 만들기 졸리운_곰 2024.12.30 214
17 [java 인공지능] 오라클, 자바 머신러닝 라이브러리 ‘트리뷰오’ 오픈소스로 공개 졸리운_곰 2023.08.27 296
16 [java 인공지능] 자바를 위한 머신 러닝 라이브러리 졸리운_곰 2023.08.27 360
15 [Java 인공지능] 오라클, 자바 머신러닝 라이브러리 ‘트리뷰오’ 오픈소스로 공개 file 졸리운_곰 2023.08.13 357
14 [java 인공지능] [java] 라이프 게임 (life game) file 졸리운_곰 2021.10.19 336
13 How to use Weka in your Java code 졸리운_곰 2020.02.01 307
12 weka and java eclipse example : A Simple Machine Learning Example in Java file 졸리운_곰 2020.01.31 362
11 머신러닝? weka file 졸리운_곰 2020.01.31 357
10 [Weka] Weka를 이용한 Iris 데이터 머신러닝 file 졸리운_곰 2020.01.30 363
9 [강좌] WEKA 사용법 (간단한 분류, 의사결정트리 분석 설명) file 졸리운_곰 2020.01.30 343
8 [JESS] Jess , 이클립스 연동 file 졸리운_곰 2019.12.22 215
7 Jess 간단한 문법 요약 졸리운_곰 2019.12.22 277
6 Jess 6.1 다운로드 friedman-hill_src_1_jess_se file 졸리운_곰 2019.12.22 184
5 java artificial intelligence Rule Engine Jess Working Memory 졸리운_곰 2019.12.22 300
4 Defining Functions in Jess 졸리운_곰 2019.12.22 389
3 Jess Language Basics 졸리운_곰 2019.12.22 272
2 Embedding Jess in a Java Application 졸리운_곰 2019.12.22 298
1 다섯개의 탑 자바로 머신러닝 라이브러리 Top 5 machine learning libraries for Java file 졸리운_곰 2017.08.22 388
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED