golang は開発言語としてはファイルの読み書きに関しては比較的便利と言えますが、実際の開発ではファイル読み込み後に文字化けが発生するなど課題も残されています。この記事では、golangでファイルが文字化けして読み込まれる原因と解決策を紹介します。
golang を使用してファイルを読み取ると、次の図に示すように、読み取り後の内容が文字化けすることがあります。
##2. 問題の原因# 文字化けの原因は数多くありますが、一般的な状況としては以下のようなものが挙げられます:
ファイルのエンコード形式とは、拡張子ではなく、保存時のファイル コンテンツのエンコード形式を指します。 golang はファイルを読み込む際、デフォルトでは UTF-8 エンコード形式で読み込むため、読み込んだファイルが UTF-8 エンコード形式でない場合は文字化けが発生します。
#読み込んだファイルが文字化けするのは、golang のデフォルトのエンコード形式が UTF-8 であることが原因です。
2.2. エンディアンが正しく処理されない
golang では、ファイルを読み取る際、エンディアン形式が UTF-16 (UTF-16LE および UTF-16BE を含む) の場合、エンディアンを正しく処理する必要があります。エンディアンネス。 UTF-16LE は、メモリ内で下位バイトが前方に、上位バイトが後方に格納されることを意味しますが、UTF-16BE はその逆です。
2.3. その他のエンコード形式変換の問題
他の形式 (CSV、XML など) のファイルを、読み取りのために golang がサポートする形式に変換する必要がある場合があります。変換中にエンコード形式の変換で問題が発生し、文字化けが発生する可能性があります。
3. 解決策上記の状況では、次の解決策を採用できます: 3.1. ファイルのエンコード形式を確認して読み取るIfファイルのエンコード形式はすでにわかっているため、ファイルを読み取るときに対応するエンコード形式を指定する必要があります。 golang は、ファイルを非常に簡単に読み取るために使用できるioutil
パッケージのbufio.NewReader
やioutil.NopCloser などのメソッドを通じてファイル エンコード形式を指定できます。コードは次のとおりです。
charset.NewReader メソッドは、指定されたエンコード形式に従って新しい
ReadCloser オブジェクトを生成し、このオブジェクトを使用してファイルを読み取ります。
3.2. バイトオーダー変換には
unicode/utf16
unicode/utf16
ライブラリを使用する場合は、次の点に注意する必要があります。ライブラリ内の最大サイズ長さは 32767 バイトです。ファイル サイズがこの制限を超える場合は、分割された読み取りが必要です。
func ReadFileWithCharset(filename string, charset string) ([]byte, error) { f, err := os.Open(filename) if err != nil { return nil, err } defer f.Close() r, err := charset.NewReader(f) if err != nil { return nil, err } defer r.Close() return ioutil.ReadAll(r) }
3.3. エンコード形式の変換には
golang.org/x/textgolang.org/ x/text
package main import ( "fmt" "io/ioutil" "unicode/utf16" ) func readUTF16File(filename string) ([]byte, error) { data, err := ioutil.ReadFile(filename) if err != nil { return nil, err } u := utf16.Decode(data) return []byte(string(u)), nil } func main() { data, _ := readUTF16File("test.txt") fmt.Println(string(data)) }
4. 概要
unicode/utf16 ライブラリを使用する必要があります。エンコード形式の変換の問題については、
golang.org/x/text
以上がgolang が文字化けしたファイルを読み込んだ場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。