>백엔드 개발 >Golang >Go에서 잘못된 UTF-8 바이트 시퀀스를 어떻게 감지할 수 있나요?

Go에서 잘못된 UTF-8 바이트 시퀀스를 어떻게 감지할 수 있나요?

DDD
DDD원래의
2024-12-14 22:17:11281검색

How Can I Detect Invalid UTF-8 Byte Sequences in Go?

Go에서 잘못된 바이트 시퀀스 감지

Go에서는 바이트 슬라이스([]byte)를 문자열로 변환할 때 다음이 가능합니다. 유니코드로 변환할 수 없는 잘못된 바이트 시퀀스가 ​​발생합니다. 이는 모든 바이트 시퀀스가 ​​유효한 UTF-8 문자를 나타내는 것은 아니라는 사실에서 발생합니다.

이러한 발생을 감지하려면 두 가지 접근 방식을 사용할 수 있습니다.

UTF-8 유효성 검사:

Tim Cooper가 언급했듯이 utf8.Valid 함수는 바이트 슬라이스에 유효한 내용이 포함되어 있는지 테스트하는 데 사용될 수 있습니다. UTF-8 바이트. 결과가 false인 경우 유효하지 않은 바이트 시퀀스가 ​​있음을 나타냅니다.

문자열 변환 고려 사항:

일반적인 가정과 달리 Go에서는 비UTF 변환을 허용합니다. -8바이트 조각을 문자열로 변환합니다. 그러나 Go의 문자열은 본질적으로 읽기 전용 바이트 슬라이스이므로 유효한 UTF-8이 아닌 바이트를 수용할 수 있다는 점에 유의하는 것이 중요합니다.

Go가 자동으로 UTF-8을 수행하는 것은 특정 상황에서만 가능합니다. 8 디코딩:

  • for i, r := range s 구문을 사용하여 문자열을 반복할 때 r 변수는 유니코드 코드 포인트(룬)를 나타내며 다음과 같습니다. 항상 유효합니다.
  • 문자열을 룬 조각(예: []rune(s))으로 변환할 때 Go는 전체 문자열을 룬으로 디코딩합니다.

두 경우 모두 , 유효하지 않은 UTF-8 문자는 U FFFD 대체 문자로 대체됩니다. 이 교체는 모든 애플리케이션에서 허용되지 않을 수 있으므로 필요한 경우 명시적인 UTF-8 유효성 검사를 수행하는 것이 좋습니다.

예:

다음 Go 프로그램을 고려하세요.

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    a := []byte{0xff}
    s := string(a)

    // Check UTF-8 validity
    if utf8.Valid(a) {
        fmt.Println("Valid UTF-8")
    } else {
        fmt.Println("Invalid UTF-8")
    }

    // Output string
    fmt.Println(s)
}

출력:

Invalid UTF-8
�

이 예에서는 바이트 슬라이스 a에 잘못된 바이트 시퀀스가 ​​포함되어 있어 "잘못된 UTF-8" 메시지가 표시됩니다. 이후 문자열로 변환 시 유효하지 않은 바이트는 대체 문자 "�"로 표시됩니다.

위 내용은 Go에서 잘못된 UTF-8 바이트 시퀀스를 어떻게 감지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.