Golang プログラムを作成する場合、中国語テキスト、絵文字表現などの非 ASCII 文字を埋め込む必要がある場合があります。ただし、埋め込まれた文字が文字化けして表示され、プログラムの実行効果や読みやすさに影響を与える場合があります。ここでは、Golang 埋め込み文字化けの一般的な原因と解決策を紹介します。
1. Golang 文字列エンコーディング
Golang の文字列は Unicode 文字で構成されるシーケンスであり、各文字はエンコード方法に応じて 1 バイトまたは 2 バイトを占めます。 Golang は、次の 3 つの文字エンコード方式をサポートしています。
UTF-8 は可変長 Unicode エンコードであり、各文字は 1 ~ 4 バイトを占めます。具体的な長さは、文字の Unicode エンコード値によって異なります。 Golang では、文字列はデフォルトで UTF-8 でエンコードされます。例:
s := "你好"
上記の文字列 s は UTF-8 エンコーディングを使用しています。
UTF-16 は、1 文字あたり 2 バイトを占める固定長の Unicode エンコーディングです。 Golang では、ルーン タイプを使用して UTF-16 エンコードされた文字を表すことができます。例:
var r rune = '好'
上記のコードは、uint16 型の整数である文字「good」の UTF-16 エンコーディングを表しています。
UTF-32 は、1 文字あたり 4 バイトを占める固定長の Unicode エンコードです。 Golang では、int32 型を使用して UTF-32 エンコードされた文字を表すことができます。例:
var c int32 = '?'
上記のコードは、uint32 型の整数である絵文字式 ? の UTF-32 エンコーディングを表しています。
2. 非 ASCII 文字を埋め込む方法
Golang では、非 ASCII 文字を埋め込む方法が 4 つあります:
文字を直接使用して、文字列内の非 ASCII 文字を表します。例:
s := "你好?"
上記のコードには、中国語の文字と絵文字表現の両方が含まれています。
非 ASCII 文字を表すにはエスケープ文字を使用します。例:
s := "你好U0001F60A"
上記のコードでは、U の後に絵文字表現を表す文字の UTF-32 エンコーディングが続きます。
Unicode エンコードされた値を使用して、非 ASCII 文字を表します。例:
s := "u4f60u597dU0001F60A"
上記のコードでは、u の後に文字の UTF-16 エンコーディングが続き、U の後に UTF-32 エンコーディングが続きます。
Base64 で非 ASCII 文字をエンコードし、エンコードされた文字列をプログラムに埋め込みます。例:
s := "5L2g5aW98J+YqA=="
上記の文字列は、「Hello?」の Base64 エンコード結果です。
3. Golang 埋め込み文字化けの原因と解決策
プログラム内で間違ったエンコード方法が使用されている場合、文字列に文字化けが含まれる原因になります。たとえば、Unicode でエンコードされた値を使用する場合、間違ったエンコード方法が使用されると文字化けが発生します。これを使用する正しい方法は、エスケープする文字の正しいエンコーディングを使用することです。例:
s := "u4f60u597dud83dude0a"
上記のコードでは、u の後に UTF-16 エンコーディングが続きます。ud83dude0a は絵文字表現の UTF-16 エンコーディングの正しい表現です。
一部のエディターでは、UTF-8 から ANSI エンコードへの変換など、ファイルの保存時にファイルのエンコードが変更されます。 。これにより、プログラム内の文字列が文字化けしてしまいます。したがって、UTF-8 エンコードをサポートするエディタを使用してファイルを保存し、ファイルのエンコードがプログラムで使用されているエンコードと一致していることを確認する必要があります。
システム環境変数がプログラム内の文字列エンコードに影響を与える場合があります。システム環境変数にエンコード方式が正しく設定されているかを確認する必要があります。
つまり、非 ASCII 文字を埋め込む場合は、エンコード方式を正しく選択し、ファイルのエンコード方式がプログラム内のエンコード方式と一致していることを確認する必要があります。文字化けを避けるために、正しいエスケープ方法を使用してください。
以上がgolang埋め込みコードが文字化けするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。