기본 콘텐츠로 건너뛰기

Java Charset 완벽 가이드: UTF-8, EUC-KR 및 인코딩 목록 총정리

JAVA / ENGINEERING

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-1ISO8859_1ISO 8859-1, Latin Alphabet No. 1
US-ASCIIASCIIAmerican Standard Code for Information Interchange
UTF-8UTF8Eight-bit UCS Transformation Format
UTF-16UTF-16Sixteen-bit UCS Transformation Format
windows-1252Cp1252Windows 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
Big5Big5Traditional Chinese
EUC-JPEUC_JPJapanese EUC
EUC-KREUC_KRKS C 5601, Korean EUC
GBKGBKSimplified Chinese
Shift_JISSJISJapanese Shift-JIS
windows-31jMS932Windows Japanese
x-windows-949MS949Windows Korean (확장 완성형)

한국어 개발 환경에서는 주로 EUC-KRMS949(x-windows-949), 그리고 UTF-8이 사용됩니다.

5. 실무 권장 사항 및 팁

최신 Java 환경 및 엔터프라이즈 애플리케이션 개발 시에는 다음 사항을 고려하는 것이 좋습니다.

  • UTF-8 사용의 생활화: 신규 프로젝트나 시스템 연동 시에는 전 세계 표준인 UTF-8을 기본 문자셋으로 채택하십시오.
  • StandardCharsets 상수 사용: Java 7 이상을 사용한다면 문자열로 "UTF-8"을 직접 입력하기보다, java.nio.charset.StandardCharsets.UTF_8 상수를 사용하여 오타를 방지하고 타입 안정성을 확보하세요.
  • 명시적 인코딩 지정: FileReaderFileWriter는 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를 사용하는 패턴을 익혀두세요.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...