Go での無効なバイト シーケンスの検証
Go でバイト スライス ([]byte) を文字列に変換しようとすると、バイト シーケンスを有効な Unicode に変換できないシナリオを処理するために重要ですstring.
解決策:
1. UTF-8 有効性チェック:
Tim Cooper が提案しているように、utf8.Valid 関数を利用して、バイト スライスが有効な UTF-8 シーケンスであるかどうかを判断できます。 utf8.Valid が false を返す場合、無効なバイトが存在することを示します。
2.非 UTF-8 バイト処理:
一般的な考えに反して、非 UTF-8 バイトも Go 文字列に格納できます。これは、Go の文字列は基本的に読み取り専用のバイト スライスであるためです。これらには無効な UTF-8 バイトが含まれる場合がありますが、問題なくアクセス、印刷、またはバイト スライスに変換し直すこともできます。
ただし、Go は特定のシナリオで UTF-8 デコードを実行します。
注: これらの変換によってパニックが発生することはありません。そのため、UTF-8 の有効性を積極的にチェックする必要があるのは、アプリケーションにとって不可欠な場合のみです (例: UTF-8 の場合)。 FFFD は受け入れられないため、エラーがスローされます)。
サンプルコード:
次のコードは、Go が無効な UTF-8 を含むバイト スライスを処理する方法を示しています:
package main import "fmt" func main() { a := []byte{0xff} // Invalid UTF-8 byte s := string(a) fmt.Println(s) // � for _, r := range s { // Range loop replaces invalid UTF-8 with U+FFFD fmt.Println(r) // 65533 } rs := []rune(s) // Conversion to runes decodes UTF-8 (U+FFFD) fmt.Println(rs) // [65533] }
以上がGo は文字列に変換するときに無効なバイト シーケンスをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。