ホームページ >バックエンド開発 >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) を文字列に変換するときに、次のことが可能です。 Unicode に変換できない無効なバイト シーケンスが発生しました。これは、すべてのバイト シーケンスが有効な UTF-8 文字を表すわけではないという事実から生じます。

そのような発生を検出するには、次の 2 つのアプローチが利用可能です。

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 変数は Unicode を表します。コード ポイント (ルーン) であり、常に有効です。
  • 文字列からルーンのスライス (つまり、[]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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。