近年、Go 言語が徐々に普及してきたため、プロジェクト開発に Go 言語を使用することを選択する人が増えています。しかし、Go 言語を使用して開発を進めていくと、時々不可解な問題に遭遇することがありますが、その中でもよくある問題の 1 つがバイト化けの問題です。次に、バイト化けの問題を詳しく紹介し、いくつかの解決策を提供します。
まず、バイトとは何かを知る必要があります。 Go 言語では、byte は 8 ビットのバイト値 (符号なし 8 ビット整数) を表す自然数型であり、ASCII 文字を表すために使用できます。 Rune は Unicode 文字を表す整数であり、ASCII 文字やその他のマルチバイト文字を表すために使用できます。通常、文字を格納するには文字列を使用し、ASCII コード文字列のバイト シーケンスを格納するにはバイト スライス ([]byte) を使用します。つまり、1 文字が 1 バイトに対応します。
文字をバイトスライスに変換する(つまり、文字列を[]バイトに変換する)と、文字化けが発生することがあります。たとえば、次のコード:
func main() { str := "你好,世界!" b := []byte(str) fmt.Println(b) }
出力結果は次のとおりです:
[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]
ご覧のとおり、プログラムは期待していた「Hello, world!」を出力しません。文字化け。では、なぜそうなるのでしょうか?
実はこれは、Go言語の文字列の最下層がバイト配列になっているためで、文字列をバイトスライスに変換する際、文字列内の文字を1文字ずつバイト型に変換することになります。 UTF-8 エンコードでは、中国語の文字は 3 バイトですが、英語の文字は 1 バイトのみです。そのため、漢字をバイトに変換すると3バイト必要になりますが、文字列を[]バイトに変換すると1文字あたり1バイトしか占有しないため、文字化けという問題が発生します。
たとえば、「Hello」という 2 文字は、UTF-8 エンコードの 16 進エンコード E4BDA0 E5A5BD に対応します。これをバイト型に変換した結果は、次のようになります。
[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}
2 つの文字を直接結合した場合
[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}
これにより文字化けが発生します。したがって、文字列をバイト スライスに変換するときは、strconv.Atoi()、strconv.ParseInt()、strconv.ParseUint()、strconv.ParseFloat() などの変換用の文字列パッケージ内の関連関数を使用する必要があります。 、strconv.Quote() など。
もちろん、特殊なケースでは、文字列パッケージの関数を使用する代わりに、文字列を手動でバイト型に変換することもできます。具体的な操作方法は次のとおりです。
func main() { str := "你好,世界!" b := make([]byte, len(str)*3) blen := 0 for _, runeValue := range str { c := utf8.EncodeRune(b[blen:], runeValue) blen += c } fmt.Println(b[:blen]) }
出力結果は次のとおりです。
[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]
手動変換の結果は、関数を使用して得られた結果と一致していることがわかります。文字列パッケージ。
上記の方法に加えて、GORM、goka、gRPC などのサードパーティ ライブラリを使用してバイト化けの問題を解決することもできます。
つまり、Go言語を使ってプロジェクトを開発する場合は、バイト化けの問題に注意し、変換にはできる限り文字列パッケージ内の関数を使用するか、サードパーティのライブラリを使用する必要があります。この問題を正しく解決することによってのみ、開発作業に Go 言語をより適切に使用できるようになります。
以上がgolangのバイト化け問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。