티스토리 뷰
안녕하세요! 이번 글에서는 String을 encode, decode 적용하는 방법을 간단히 소개해드리려 합니다. 기존에 문자를 주로 사용하였을 때는 문자열을 그대로 날리게 되면 문자열이 깨져보이는 현상이 있었는데요, 이 부분이 대표적으로 인코딩과 디코딩이 많이 들어가게 되는 원리중에 하나입니다.
최근에는 문자를 자주 사용할 일이 없어 Encoder, Decoder를 자주 사용하지 않지만 우리가 살고 있는 국가 또는 지역마다 인코딩 기법이 달라 종종 내가 보낸 문자열과 해외에 사는 다른 사람이 받은 문자열이 다르게 보일 때가 있습니다. 이를 해결하기 위해 Java 에서는 기본적으로 Encoder(인코딩을 해주는 녀석)과 Decoder(인코딩한 문자열을 해독하는 녀석)으로 나뉘게 됩니다. 미국에 살고 있는 거주자가 영어를 쓰고 우리 나라 사람이 한국어를 쓰듯이 인코더를 통해 일종의 번역 역할을 한다 생각하시면 이해가 빠르실 겁니다.
인코딩을 해주기 전에 먼저 StandardCharsets 이라는 클래스를 알아야 합니다. 자바 1.7버전부터 생성이 된 이 클래스는 기본으로 제공이 되고 각각 포맷에 맞게 변환을 해주면 됩니다. 기본적으로 제공되는 캐릭터셋은 다음과 같습니다.
public final class StandardCharsets {
private StandardCharsets() {
throw new AssertionError("No java.nio.charset.StandardCharsets instances for you!");
}
/**
* Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the
* Unicode character set
*/
public static final Charset US_ASCII = sun.nio.cs.US_ASCII.INSTANCE;
/**
* ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
*/
public static final Charset ISO_8859_1 = sun.nio.cs.ISO_8859_1.INSTANCE;
/**
* Eight-bit UCS Transformation Format
*/
public static final Charset UTF_8 = sun.nio.cs.UTF_8.INSTANCE;
/**
* Sixteen-bit UCS Transformation Format, big-endian byte order
*/
public static final Charset UTF_16BE = new sun.nio.cs.UTF_16BE();
/**
* Sixteen-bit UCS Transformation Format, little-endian byte order
*/
public static final Charset UTF_16LE = new sun.nio.cs.UTF_16LE();
/**
* Sixteen-bit UCS Transformation Format, byte order identified by an
* optional byte-order mark
*/
public static final Charset UTF_16 = new sun.nio.cs.UTF_16();
}
우리는 기본적으로 8비트의 UCS 포맷을 사용하여 한글을 형성합니다. 한글은 기존에 사용하던 ASCII 문자열로는 표현이 안되고, 이를 확장한 개념인 UTF-8 방법을 사용하여 한글 및 특수 기호를 사용하기 때문에 대표적으로 UTF-8을 사용합니다.
그래서 쉽게 표현할 수 있는 방법을 나열해보겠습니다.
// text 문자열을 받아 해당 Character set으로 인코딩
public String encode(String text) {
return URLEncoder.encode(text, StandardCharsets.UTF_8);
}
// 인코딩된 문자열을 받아 해당 Character set으로 디코딩
public String decode(String text) {
return URLDecoder.decode(text, StandardCharsets.UTF_8);
}
디코더는 인코더가 없으면 크게 쓸 일이 없는 녀석입니다. 그래서 문자열을 인코딩, 디코딩한 샘플도 남겨봅니다.
@Test
@DisplayName("인코딩 디코딩 테스트")
public void getEncodeAndDecodeTest() {
final String text = "안녕하세요! Hello!";
try {
final String encode1 = URLEncoder.encode(text, StandardCharsets.UTF_8);
final String encode2 = URLEncoder.encode(text, "UTF-8");
System.out.println("encode1 = " + encode1);
System.out.println("encode2 = " + encode2);
final String decode1 = URLDecoder.decode(encode1, StandardCharsets.UTF_8);
final String decode2 = URLDecoder.decode(encode2, "UTF-8");
System.out.println("decode1 = " + decode1);
System.out.println("decode2 = " + decode2);
final String decodeText = URLDecoder.decode(text, StandardCharsets.UTF_8);
System.out.println("decodeText = " + decodeText);
} catch (Exception e) {
}
}
결과로 나온 것을 확인해보면 일반 텍스트는 디코딩을 하여도 바뀐점이 없는 것으로 확인됩니다. 그리고 영어로 된 문자열들은 인코딩에 적용되지 않고 똑같은 결과물이 출력되고 있네요.
오늘은 이렇게 인코더와 디코더를 사용하는 것을 확인해보았습니다. 자주 사용할 함수는 아니지만 그래도 도움이 되셨으면 하는 바람에 적어봅니다! 감사합니다~
'Server' 카테고리의 다른 글
지금 봐도 괜찮은 배달의민족 도메인 설계 (1) | 2022.03.06 |
---|---|
[Java] JPA Detached Entity passed to persist 에러 해결 로그 (2) | 2022.02.14 |
[Java] Rest Template 을 사용하여 API 통신하기 (1) | 2022.02.07 |
특정 잡만 수행하고 싶을 때 (1) | 2022.01.10 |
Job & Step 병렬 처리 하기 (2) | 2022.01.05 |
[Java] Stream GroupBy 사용하기 (2) | 2021.12.30 |