ホームページ >バックエンド開発 >Golang >Go は文字列内の変換不可能なバイトをどのように処理し、検出するのでしょうか?

Go は文字列内の変換不可能なバイトをどのように処理し、検出するのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-06 00:20:16340ブラウズ

How Does Go Handle and Detect Unconvertible Bytes in Strings?

Go 文字列内の変換不可能なバイトの検出

Go では、特定のバイト シーケンスを有効な Unicode 文字として解釈できません。これらの無効なシーケンスを検出することは、シームレスな文字列処理にとって重要です。詳細な説明は次のとおりです:

UTF-8 有効性チェック:

Tim Cooper 氏が述べたように、utf8.Valid を使用して UTF-8 の有効性を確認できます。ただし、Go 文字列には UTF-8 以外の文字が含まれる可能性があることに注意することが重要です。これは、文字列は本質的にバイトのスライスであり、これらのバイトが常に UTF-8 エンコーディングに準拠するとは限らないためです。

デコード動作:

Go は UTF のみを実行します。 2 つの特定のインスタンスでの -8 デコード:

  • for i, r を使用した文字列の反復処理:= range s、r は Unicode コード ポイント (ルーン型) を表します
  • []rune(s) を使用して文字列をルーンのスライスに変換します

これらの両方で場合によっては、無効な UTF-8 文字は Unicode コード ポイント U FFFD に置き換えられ、サポートされていない文字のプレースホルダーとして機能します。 glyphs.

クラッシュの例外:

これらの変換は決してクラッシュしないことに注意してください。したがって、UTF-8 の有効性を明示的にチェックする必要があるのは、代わりに U FFFD を受け入れられない入力を処理する場合など、アプリケーションで必要な場合に限られます。

例:

次のコードは、Go が無効な UTF-8 を処理する方法を示しています。 bytes:

package main

import "fmt"

func main() {
    a := []byte{0xff}
    s := string(a)
    fmt.Println(s)
    for _, r := range s {
        fmt.Println(r)
    }
    rs := []rune(s)
    fmt.Println(rs)
}

Output:

�
65533
[65533]

ご覧のとおり、文字列全体を出力すると、無効なバイト シーケンスは � として表示されます。反復処理すると、U FFFD の Unicode コード ポイントが返されます。そして、ルーンのスライスに変換すると、U FFFD を表す単一のルーンが返されます。

したがって、無効な UTF-8 バイトを文字列に変換するときに Go がクラッシュすることはありませんが、特定のルーン文字に注意することが重要です。動作を確認し、アプリケーションでそれに応じて処理します。

以上がGo は文字列内の変換不可能なバイトをどのように処理し、検出するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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