1. 개요

Java에서 String 을 처리할 때 특정 문자 집합으로 인코딩해야 하는 경우가 있습니다.

이 예제은 문자열 을 UTF-8 문자셋 으로 인코딩하는 다양한 방법을 보여주는 실용적인 사용방법(예제) 입니다.

보다 기술적인 심층 분석은 문자 인코딩 사용방법(예제)를 참조하세요 .

2. 문제 정의

Java 인코딩을 보여주기 위해 독일어 문자열 "Entwickeln Sie mit Vergnügen"으로 작업합니다.

String germanString = "Entwickeln Sie mit Vergnügen";
byte[] germanBytes = germanString.getBytes();

String asciiEncodedString = new String(germanBytes, StandardCharsets.US_ASCII);

assertNotEquals(asciiEncodedString, germanString);

US_ASCII를 사용하여 인코딩된 이 문자열 은 ASCII가 아닌 ü 문자를 이해하지 못하기 때문에 인쇄 시 "Entwickeln Sie mit Vergn?gen" 값을 제공합니다 .

그러나 모든 영어 문자를 사용하는 ASCII로 인코딩된 문자열 을 UTF-8로 변환할 때 동일한 문자열을 얻습니다.

String englishString = "Develop with pleasure";
byte[] englishBytes = englishString.getBytes();

String asciiEncondedEnglishString = new String(englishBytes, StandardCharsets.US_ASCII);

assertEquals(asciiEncondedEnglishString, englishString);

UTF-8 인코딩을 사용할 때 어떤 일이 발생하는지 봅시다.

3. 코어 자바로 인코딩

핵심 라이브러리부터 시작하겠습니다.

String 은 Java에서 변경할 수 없습니다. 즉, String 문자 인코딩을 변경할 수 없습니다. 원하는 것을 얻으려면 String 의 바이트를 복사한 다음 원하는 인코딩으로 새 바이트를 만들어야 합니다.

먼저 String 바이트를 가져온 다음 검색된 바이트와 원하는 문자 집합을 사용하여 새 바이트를 만듭니다.

String rawString = "Entwickeln Sie mit Vergnügen";
byte[] bytes = rawString.getBytes(StandardCharsets.UTF_8);

String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8);

assertEquals(rawString, utf8EncodedString);

4. Java 7 StandardCharsets 로 인코딩

또는 Java 7 에 도입된 StandardCharsets 클래스 를 사용하여 String 을 인코딩할 수 있습니다 .

먼저 문자열 을 바이트로 디코딩하고 두 번째로 문자열 을 UTF-8로 인코딩합니다.

String rawString = "Entwickeln Sie mit Vergnügen";
ByteBuffer buffer = StandardCharsets.UTF_8.encode(rawString); 

String utf8EncodedString = StandardCharsets.UTF_8.decode(buffer).toString();

assertEquals(rawString, utf8EncodedString);

5. Commons-Codec으로 인코딩하기

핵심 Java를 사용하는 것 외에도 Apache Commons 코덱 을 사용  하여 동일한 결과를 얻을 수 있습니다.

Apache Commons Codec은 다양한 형식의 간단한 인코더와 디코더가 포함된 편리한 패키지입니다.

먼저 프로젝트 구성부터 시작하겠습니다.

Maven을 사용할 때 pom.xml 에 commons-codec 의존성 을 추가해야 합니다 .

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.14</version>
</dependency>

그런 다음 우리의 경우 가장 흥미로운 클래스는 String 을 인코딩하는 메서드를 제공하는 StringUtils 입니다.

이 클래스를 사용하여 UTF-8로 인코딩된 문자열 을 얻는 것은 매우 간단합니다.

String rawString = "Entwickeln Sie mit Vergnügen"; 
byte[] bytes = StringUtils.getBytesUtf8(rawString);
 
String utf8EncodedString = StringUtils.newStringUtf8(bytes);

assertEquals(rawString, utf8EncodedString);

6. 결론

문자열 을 UTF-8로 인코딩하는 것은 어렵지 않지만 그렇게 직관적이지는 않습니다. 이 기사에서는 핵심 Java 또는 Apache Commons 코덱을 사용하여 이를 수행하는 세 가지 방법을 제시합니다.

항상 그렇듯이 코드 샘플은 GitHub 에서 찾을 수 있습니다 .

Generic footer banner