ホームページ > バックエンド開発 > Golang > Go は文字列に変換するときに無効なバイト シーケンスをどのように処理しますか?

Go は文字列に変換するときに無効なバイト シーケンスをどのように処理しますか?

Linda Hamilton
リリース: 2024-12-06 04:44:17
オリジナル
512 人が閲覧しました

How Does Go Handle Invalid Byte Sequences When Converting to Strings?

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 デコードを実行します。

  • 範囲ループ: 範囲ループを使用して文字列の Unicode コード ポイントを反復処理する場合、返されるルーン値は Unicode コード ポイントであり、無効な UTF-8 は置換文字 U FFFD (�) に置き換えられます。
  • ルーンへの変換: 文字列をルーンのスライスに変換します ( []rune) は文字列全体をデコードし、無効な UTF-8 を U に置き換えます。 FFFD.

注: これらの変換によってパニックが発生することはありません。そのため、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート