요즘 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 |
---|
댓글