HttpUrlConnection 한글 깨짐

Jisoo Choi·2021년 10월 12일
0
post-thumbnail

🚩 Problem

외부 API를 연동하는 작업을 하는데 응답을 받아오는 한글이 깨지는 오류를 발견하였다.
보통 자주 발견하는 InputStreamReader에 인코딩 형식 오류인 Charset.forName("UTF-8") 도 있는데 한글이 깨지는 이유를 찾던 중에,

OutputStream os = conn.getOutputStream();  -- OutputStream 객체 생성
os.write(body.getBytes());                 -- request Body에 Data 셋팅

이런 식의 Request Body에 Data를 담기위해 OutputStream 객체를 생성하고 데이터를 셋팅하는 부분에서 인코딩을 지정해주지 않았음을 발견했다.

💡 해결

아래처럼 인코딩을 지정해주었다!

os.write(body.getBytes(StandardCharsets.UTF_8));

지금껏 잘 돌아가던건 뭘까...? 🤦


[TIL] 문자열 인코딩

🔖 charset.forname( utf-8 ) 와 standardcharsets.utf_8의 차이

  • 인수없이 text.getBytes()를 호출하면 실제로 애플리케이션의 기본 인코딩에서 문자열을 나타내는 byte 배열이 표시된다.
    이때, 올바르게 사용하려면 getBytes() 메서드 호출에서 정확한 인코딩을 지정해야 한다.

[Java 7 이상]

  • StandardCharsets
    • 이 상수는 문자열이 아니며 실제 Charset인스턴스다.
    • StandardCharsets 클래스에는 모든 자바 가상 머신에서 반드시 지원해야 하는 문자 인코딩을 나타내는 Charset 타입 정적 변수가 있다.
    import java.nio.charset.StandardCharsets
    
    val bytes = text.getBytes(StandardCharsets.UTF_8)

[Java 6]

  • Charset
    import java.nio.charset.Charset
    
    val bytes = text.getBytes(Charset.forName("UTF-8"))

이렇게하면 bytes에 "UTF-8"로 인코딩 된 텍스트가 포함된다.

다음에는 HttpURLConnection Request Header를 설정하는 방법도 알아보겠다 :)


참고:

https://pythonq.com/so/java/725470

https://triest.tistory.com/14

profile
👩‍🚀 No worries! Just record

0개의 댓글