Java Charset 완벽 가이드: UTF-8, EUC-KR 및 인코딩 목록 총정리
Java 환경에서 문자열 깨짐 문제를 해결하기 위한 Charset의 작동 원리와 java.nio vs java.io의 명명 규칙 차이, 그리고 JRE 환경별 지원되는 인코딩 목록을 상세히 정리합니다.
1. Java 문자 인코딩 처리 핵심 클래스
Java 개발을 하다 보면 Unicode와 다양한 문자 인코딩(UTF-8, EUC-KR 등) 간의 변환이 필요한 시점이 반드시 찾아옵니다. 이때 주로 사용되는 클래스는 다음과 같습니다.
- InputStreamReader / OutputStreamWriter: 바이트 스트림과 문자 스트림을 연결하며 인코딩을 지정합니다.
- String:
getBytes(String charsetName)또는new String(byte[], charsetName)메서드를 통해 변환합니다. - java.nio.charset.Charset: 인코딩의 표준 이름(Canonical Name)과 별칭(Alias)을 관리하고 변환을 돕는 핵심 클래스입니다.
특히 java.nio.charset.Charset 클래스는 플랫폼 간 호환성을 위해 표준화된 이름을 제공하므로, 인코딩을 지정할 때 이 클래스에서 정의한 이름을 사용하는 것이 안전합니다.
2. JRE 버전별 인코딩 지원 차이 (Basic vs Extended)
Sun(Oracle)의 J2SE 5.0 기준으로, JRE 설치 형태에 따라 지원하는 인코딩 범위에 차이가 있었습니다. 이는 레거시 시스템을 다룰 때 중요한 포인트가 됩니다.
- JDK 5.0 (전체 OS): 기본 및 확장 인코딩을 모두 지원합니다.
- JRE 5.0 (Windows - European): 기본 인코딩 세트(Basic Encoding Set)만 지원합니다.
- JRE 5.0 (Windows - International):
lib/charsets.jar파일이 포함되어 있어 모든 인코딩(확장 세트 포함)을 지원합니다.
만약 Windows 환경의 JRE에서 한글이나 특수 외국어 인코딩이 인식되지 않는다면, 설치된 JRE가 International 버전인지 확인하거나 charsets.jar의 존재 여부를 확인해야 합니다.
3. 기본 인코딩 세트 (Basic Encoding Set)
기본 인코딩 세트는 lib/rt.jar에 포함되어 있으며, 모든 J2SE 구현체에서 반드시 지원해야 하는 인코딩입니다. 주요 목록은 아래와 같습니다.
| Canonical Name (java.nio) | Alias (java.io / java.lang) | Description |
|---|---|---|
| ISO-8859-1 | ISO8859_1 | ISO 8859-1, Latin Alphabet No. 1 |
| US-ASCII | ASCII | American Standard Code for Information Interchange |
| UTF-8 | UTF8 | Eight-bit UCS Transformation Format |
| UTF-16 | UTF-16 | Sixteen-bit UCS Transformation Format |
| windows-1252 | Cp1252 | Windows Latin-1 |
위 목록 외에도 다양한 ISO-8859 시리즈가 기본 세트에 포함됩니다. UTF-8, ISO-8859-1, US-ASCII는 가장 빈번하게 사용되는 인코딩입니다.
4. 확장 인코딩 세트 (Extended Encoding Set)
확장 인코딩 세트는 lib/charsets.jar를 통해 제공되며, 한국어, 중국어, 일본어 등 CJK 언어와 다양한 국가별 특수 인코딩을 포함합니다.
| Canonical Name (java.nio) | Alias (java.io / java.lang) | Description |
|---|---|---|
| Big5 | Big5 | Traditional Chinese |
| EUC-JP | EUC_JP | Japanese EUC |
| EUC-KR | EUC_KR | KS C 5601, Korean EUC |
| GBK | GBK | Simplified Chinese |
| Shift_JIS | SJIS | Japanese Shift-JIS |
| windows-31j | MS932 | Windows Japanese |
| x-windows-949 | MS949 | Windows Korean (확장 완성형) |
한국어 개발 환경에서는 주로 EUC-KR과 MS949(x-windows-949), 그리고 UTF-8이 사용됩니다.
5. 실무 권장 사항 및 팁
최신 Java 환경 및 엔터프라이즈 애플리케이션 개발 시에는 다음 사항을 고려하는 것이 좋습니다.
- UTF-8 사용의 생활화: 신규 프로젝트나 시스템 연동 시에는 전 세계 표준인 UTF-8을 기본 문자셋으로 채택하십시오.
- StandardCharsets 상수 사용: Java 7 이상을 사용한다면 문자열로
"UTF-8"을 직접 입력하기보다,java.nio.charset.StandardCharsets.UTF_8상수를 사용하여 오타를 방지하고 타입 안정성을 확보하세요. - 명시적 인코딩 지정:
FileReader나FileWriter는 OS의 기본 인코딩(Windows: MS949, Linux: UTF-8)을 따르므로 동작이 불일치할 수 있습니다. 항상 스트림 클래스로 인코딩을 지정하세요.
6. [실전 예제] 인코딩 변환 및 I/O 코드
실무에서 자주 사용되는 문자열 인코딩 변환과, OS 환경에 구애받지 않는 안전한 파일 읽기 예제입니다.
import java.io.*;
import java.nio.charset.StandardCharsets;
public class CharsetExample {
public static void main(String[] args) {
// 1. 문자열 인코딩 변환 (String <-> Byte Array)
String original = "한글 테스트 String";
// String을 UTF-8 바이트 배열로 변환
byte[] utf8Bytes = original.getBytes(StandardCharsets.UTF_8);
// String을 EUC-KR 바이트 배열로 변환 (예외 처리 필요)
try {
byte[] eucKrBytes = original.getBytes("EUC-KR");
// 바이트 배열을 다시 문자열로 복원
String decodedUtf8 = new String(utf8Bytes, StandardCharsets.UTF_8);
String decodedEucKr = new String(eucKrBytes, "EUC-KR");
System.out.println("UTF-8 복원: " + decodedUtf8);
System.out.println("EUC-KR 복원: " + decodedEucKr);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 2. 파일 I/O 시 인코딩 명시하기 (권장)
// FileReader 대신 FileInputStream + InputStreamReader 조합 사용
File file = new File("test_utf8.txt");
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
💡 Tip: FileReader는 편리하지만 인코딩을 지정할 수 없습니다. 서버 이중화(Windows 개발, Linux 운영) 환경에서 한글 깨짐의 주범이 되므로, 위 예제처럼 InputStreamReader를 사용하는 패턴을 익혀두세요.
댓글
댓글 쓰기