Programming/GO

Golang - 한글 UTF8 을 EUCKR 서버로 인코딩처리하기.

긍정왕웹서퍼 2022. 4. 30. 16:40
728x90

개요

저는 현재 맡은 업무가 고(golang) 언어로 API 서버를 개발하는 업무를 맡았습니다.

그런데, 개발 중간에 tcp 통신을 통해 다른 server에게 request 해야할 사항이 생겼는데,

문제는 이 서버에서 한글은 EUC-KR 형식인겁니다..  이게 왜 문제냐? 바로바로..

고 (golang 이하 고 라고 하겠습니다)는  rune 이라는 특이한 스타일로 타입을 사용하고 이를 UTF-8로 인코딩합니다.

그러므로 고 언어는 UTF-8 타입을 디폴트로 사용하게 되는데요, 이 타입 그대로 byte 타입으로 변환하게 된다면,

byte 코드 또한 그 타입을 따라갑니다. 그래서 통신하는 정보에 한글이 필요하다면 어떤 타입의 char type을 정해뒀는지

확인 할 필요가 있습니다. 

 

JSON

보통 다른 server 로 보낼 때, json 라이브러리의 Marshal메소드가 byte 코드로 손쉽게 변환해 주어 많이들 사용하는데요

func Marshaling(st string) []byte {
	return ma := json.Marshal(st) // byte type으로 변환된다.
}

Marshal 메서드는 정말 편하지만, 고 언어로 한글을 처리해 다른 서버로 보내는데 타입이 다르다면? 

기존의 string 을 utf8 -> euckr 로 바꿔서 Marshaling 하면 될까요? 안됩니다.. 이유는 바로 Marshal 메서드의 작업역시 

고 언어가 변환할때, utf8로 인코딩을 진행하기 때문에 그전에 어떤 타입의 언어든 utf8을 기준으로 변환됩니다.

 

그래서 저는 Marshal 로 json 의 byte타입으로 변환한뒤, 이를 다시 문자열(string)으로 변환하고, 원하는 타입으로 전환 후 다시 byte로 변환해 보낸다면? json 형식은 유지된채 문자열의 타입만 변경되어 byte code로 보낼 수 있게됩니다!

이를 위해 저는 중간에 메서드를 새로 만들었습니다.

 

func Marshaling(st string) []byte {
	ma := json.Marshal(st) // json 형식의 byte code로 변환된다.
    st := bytes.NewBuffer(ma).string() // convert -> byte to string 
    s, _, _ := transform.String(korean.EUCKR.NewEncoder(), st) // utf8 -> euc-kr 변환
    bt := []byte(s) // 타입이 바뀐 문자열을 다시 byte 로 변환하기.
    
    return bt
}

이처럼 몇단계의 과정을 메서드로 만든다면 쉽게 byte -> string(utf8) -> string(euckr) -> byte 로 변환되어 받는 서버의 문자타입에 맞추어 보낼 수 있게 됩니다!! 

 

고 언어를 사용해 진행하는 첫 프로젝트인 만큼 몰라던 점이 많았는데 많은 공부가 되었습니다..

 

요약 

1. 고 언어는 UTF-8 타입이 default 

2. json 으로 보내야할때, json.Marshal 을 많이 사용하는데 이 또한 UTF-8

3. EUC-KR 타입으로 변환해서 보내야한다면 Marshal 후 타입을 다시 바꿔서 보내자

 

'Programming > GO' 카테고리의 다른 글

GO - unresolved dependency, GOPATH error  (0) 2022.05.15
GO - RESTful API만들기 Echo Framework & Gorm ORM  (0) 2022.04.30