본문 바로가기
text/Go

VScode 에서 Go 한글 print가 안되서 한 삽질 적어놓기

by hoonzii 2022. 10. 12.
반응형

요즘 go에 흥미가 생겨서 go 어떤 강의를 보는 중인데

해당 강의에서 페이지 긁어오는 예제를 돌리는데 문제가 발생했다.

 

예시로 보여주는 코드가 에러가 난 것! (indeed.com에서 뭐 정보 긁어오는 것)

댓글에 보니, 각자 알아서 문제가 난 것에 대해 구글링 해서 푸세요 라고 적혀있었고...

 

강사는 그 댓글에 좋아요 찍은 거 보니 내가 스스로 공부해야겠군! 해서

나는 네이버에서 기사를 가져오자! 하고 코드를 조금 바꿨었다.

페이지를 긁는 것 까진 좋으나… 뭐 때문인지 VScode 상에서는 가져온 한글이 죄다 깨져서 나왔다

 

하...

구글에서 찾은 방법으로 하나씩 적용해본 후기를 적어보자.

 

VScode 실행 창의 인코딩을 utf-8에서 euc-kr로 바꿔보자

아래의 인코딩 (UTF-8)에서

EUC-KR로 바꿔준다.

그렇지만 위 실행결과가 살짝 보이는데 결과적으로는 나한테 안됐다.

 

 

rune 타입으로 변경해 출력해보자.

출처 : [https://fenderist.tistory.com/355]

해당 블로그에 적혀있기를 go의 경우는 한국어를 3byte로 처리하기 때문에 글자가 깨진다고 한다.

자 그럼 다시 본래의 인코딩 euc-kr → utf-8로 변경한 뒤, 위 블로그에서 소개해준 대로

func printKorean(text string) {
	runeString := []rune(text)
	for _, char := range runeString {
		fmt.Printf("%c", char)
	}
	fmt.Printf("\n")
}

func main() {
	str := "안녕하세요"
	printKorean(str)
}

결과는?

 

오! 됐다. 한글이 정상적으로 나온 것을 확인할 수 있다.

이제 네이버에서 가져온 글자를 한글 변환 함수 ( printKorean )에 넣으면 화면상에 한글이 찍히게 될까?

우선 원래 코드에 저 함수를 집어넣어서 터미널에 찍히는지 확인해보자

...
if exists == false {
	title := selection.Text()
	title = cleanString(title)
	printKorean(title)
	fmt.Println(title, findUrl)
}
...

굉장히 단편적인 코드지만 조금 부연설명을 하자면,

네이버 기사 목록에서 가져온 기사 제목(string)을 앞, 뒤의 띄어쓰기를 제거 한 다음 fmt.print 하는 코드다.

중간에 printKorean 함수를 통해 터미널에서 정상 작동하는지 살펴보자.

하…

transform 패키지를 이용해 euc-kr로 변경해보자.

 

출처 : [https://m.blog.naver.com/soopinan/220958025882]

해당 블로그에 따르면 버퍼를 하나 만든 다음, 해당 버퍼에 들어올 string의 인코딩 방법을 설정하고, 입력하면 된다고 나와있다.

위에 적은 함수를 조금 바꿔주자.

func printKorean(text string) {
	var bufs bytes.Buffer
	wr := transform.NewWriter(&bufs, korean.EUCKR.NewEncoder())
	wr.Write([]byte(text))
	wr.Close()
	fmt.Println(bufs.String())
}

string을 euc-kr로 인코딩하니, 터미널의 인코딩 역시 euc-kr로 바꿔주고

코드를 다시 돌려보자.

응 안돼

 

위 2번째 방법을 볼 때, 내가 한글로 적어서 그걸 print 하면 제대로 돌아가는 걸 확인할 수 있다.

 

그렇다면, 네이버에서 텍스트를 가져올 때 이미 텍스트가 뭔가 다르지 않을까?

그러니 rune 타입으로 변환하고, 인코딩을 euc-kr로 해도 이상하게 나오는 것 아닐까?

혹시 euc-kr로 인코딩이 아닌 디코딩이 필요한 게 아닐까?

 

저 위 코드를 조금 바꿔보자.

func printKorean(text string) {
	var bufs bytes.Buffer
	wr := transform.NewWriter(&bufs, korean.EUCKR.NewDecoder())
	wr.Write([]byte(text))
	wr.Close()
	fmt.Println(bufs.String())
}

바뀐 부분은 NewEncoder -> NewDecoder 밖에 없다.

잘 돌아가는지 확인해보자

 

 

...
if exists == false {
	title := selection.Text()
	title = cleanString(title)
	printKorean(title)
	fmt.Println(title, findUrl)
}
...

title을 가져온 뒤, 앞, 뒤 띄어쓰기를 제거한 title string을 printKorean 함수에 넣었다.

 

결과는 터미널에 정상적으로 한글이 나온 걸 확인할 수 있다.

 

반응형

'text > Go' 카테고리의 다른 글

벡터 곱셉 (inner, cross, outer product) with Go  (0) 2022.10.22

댓글