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 デコード:
どちらの場合も、無効な 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 サイトの他の関連記事を参照してください。