golang 바이트 왜곡 문제를 해결하는 방법

PHPz
풀어 주다: 2023-03-31 10:57:52
원래의
1574명이 탐색했습니다.

최근에는 Go 언어가 점차 대중화되면서 프로젝트 개발에 Go 언어를 사용하는 사람들이 점점 더 많아지고 있습니다. 그러나 Go 언어를 사용하는 개발 과정에서 우리는 때때로 설명할 수 없는 문제에 직면합니다. 가장 일반적인 문제 중 하나는 바이트 왜곡 문자 문제입니다. 다음으로 바이트 왜곡 문제를 자세히 소개하고 몇 가지 해결 방법을 제시하겠습니다.

우선 바이트가 무엇인지 알아야 합니다. Go 언어에서 바이트는 ASCII 문자를 나타내는 데 사용할 수 있는 8비트 바이트 값(부호 없는 8비트 정수)을 나타내는 자연수 유형입니다. Rune은 ASCII 문자 및 기타 멀티바이트 문자를 나타내는 데 사용할 수 있는 유니코드 문자를 나타내는 정수입니다. 일반적으로 문자열을 사용하여 문자를 저장하고, 바이트 슬라이스([]바이트)는 ASCII 코드 문자열의 바이트 시퀀스를 저장하는 데 사용됩니다. 즉, 한 문자가 한 바이트에 해당합니다.

문자를 바이트 슬라이스로 변환(즉, 문자열을 []바이트로 변환)할 때 문자가 깨질 수 있는 경우가 있습니다. 예를 들어, 다음 코드는

func main() {
    str := "你好,世界!"
    b := []byte(str)
    fmt.Println(b)
}
로그인 후 복사

출력 결과는 다음과 같습니다.

[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]
로그인 후 복사
로그인 후 복사

보시다시피 프로그램은 우리가 예상한 "Hello, world!"를 출력하지 않고 여러 문자를 왜곡하여 출력합니다. 그렇다면 왜 이런가요?

실제로는 Go 언어에서 문자열의 맨 아래 레이어가 바이트 배열이기 때문입니다. 문자열을 바이트 슬라이스로 변환하면 문자열에 포함된 문자가 하나씩 바이트 유형으로 변환됩니다. UTF-8 인코딩에서 중국어 문자는 3바이트인 반면 영문자는 1바이트에 불과합니다. 따라서 한자를 바이트로 변환할 때에는 3바이트를 차지해야 하지만, 문자열을 []바이트로 변환할 때에는 각 문자가 1바이트만 차지하므로 글자가 깨져버리는 문제가 발생한다.

예를 들어 "Hello" 두 문자는 UTF-8 인코딩의 16진수 인코딩 E4BDA0 E5A5BD에 해당합니다. 이를 바이트 유형으로 변환한 결과는 다음과 같습니다.

[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}
로그인 후 복사
로그인 후 복사

2바이트를 직접 연결하면 Get up and get:

[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}
로그인 후 복사
로그인 후 복사

이로 인해 잘못된 코드 문제가 발생합니다. 따라서 문자열을 바이트 슬라이스로 변환할 때는 strconv.Atoi(), strconv.ParseInt(), strconv.ParseUint(), strconv.ParseFloat() 등 변환을 위해 문자열 패키지의 관련 함수를 사용해야 합니다. , strconv.Quote() 등이 있습니다.

물론, 일부 특수한 경우에는 문자열 패키지의 함수를 사용하는 대신 수동으로 문자열을 바이트 유형으로 변환할 수도 있습니다. 구체적인 연산 방법은 다음과 같습니다.

func main() {
    str := "你好,世界!"
    b := make([]byte, len(str)*3)
    blen := 0
    for _, runeValue := range str {
        c := utf8.EncodeRune(b[blen:], runeValue)
        blen += c
    }
    fmt.Println(b[:blen])
}
로그인 후 복사

출력 결과는

[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]
로그인 후 복사
로그인 후 복사

수동 변환 결과가 문자열 패키지의 함수를 사용하여 얻은 결과와 일치함을 알 수 있습니다.

위의 방법 외에도 GORM, goka, gRPC 등과 같은 타사 라이브러리를 사용하여 바이트 왜곡 문제를 해결할 수도 있습니다.

즉, Go 언어를 사용하여 프로젝트를 개발할 때 바이트 왜곡 문자 문제에 주의해야 하며, 변환을 위해 문자열 패키지의 함수를 최대한 사용하거나 타사 라이브러리를 사용해야 합니다. 이 문제를 올바르게 해결해야만 개발 작업에 Go 언어를 더 잘 사용할 수 있습니다.

위 내용은 golang 바이트 왜곡 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿