概要
以下、自分用メモです。忘れない内にメモメモ。
現在、ほとんどのファイルが UTF-8 とかになっていることが多いですが
それでも、実務とかだと未だに Shift-JIS とか EUC-JP なファイルをよく見ることがあります。
Goで上記の様なエンコーディングのファイルを扱う場合は
このパッケージを利用します。この中に エンコーダーとデコーダーがあるので
それでラップした Reader, Writer を使います。
インストール
普通に go get するだけです。
go get golang.org/x/text/encoding/japanese
サンプル
Shift-JIS
以下は、Shift-JISなファイルを読み書きするサンプル
package japanese import ( "io/ioutil" "os" "github.com/devlights/gomy/output" "golang.org/x/text/encoding/japanese" "golang.org/x/text/transform" ) // SjisReadWrite は、Shift-JISのデータを読み書きするサンプルです. func SjisReadWrite() error { // ------------------------------------------------------------- // Go で、日本語特有のエンコーディング (sjis や euc-jp など) を扱う場合 // 以下のパッケージを利用する. // // golang.org/x/text/encoding/japanese // // インストールは、普通に go get するだけ。 // go get golang.org/x/text/encoding/japanese // go get すると、 golang.org/x/text が依存関係として追加される. // // japanese.ShiftJIS が sjis, japanese.EUCJP が euc-jp に // 対応している。どちらも Encoder と Decoder を持っているので // それを transform.NewXXX に渡すことにより、*io.Reader or *io.Writer を // 取得することができる。 // // transform.NewReader に渡すのが Decoder // transform.NewWriter に渡すのが Encoder // // となる。 // ------------------------------------------------------------- dir, err := ioutil.TempDir("", "try-golang") if err != nil { return err } defer func() { _ = os.RemoveAll(dir) }() // ------------------------------------------------------------- // shift-jis データを書き出し // ------------------------------------------------------------- fpath, err := func() (string, error) { fp, ioErr := ioutil.TempFile(dir, "sjis") if ioErr != nil { return "", ioErr } defer func() { _ = fp.Close() }() writer := transform.NewWriter(fp, japanese.ShiftJIS.NewEncoder()) _, ioErr = writer.Write([]byte("こんにちわWorld")) if ioErr != nil { return "", ioErr } return fp.Name(), nil }() if err != nil { return err } // ------------------------------------------------------------- // shift-jis データを読み出し // ------------------------------------------------------------- err = func() error { fp, ioErr := os.Open(fpath) if ioErr != nil { return ioErr } defer func() { _ = fp.Close() }() reader := transform.NewReader(fp, japanese.ShiftJIS.NewDecoder()) allData, ioErr := ioutil.ReadAll(reader) if ioErr != nil { return ioErr } output.Stdoutl("[sjis]", string(allData)) return nil }() return nil }
try-golang/sjis_readwrite.go at master · devlights/try-golang · GitHub
EUC-JP
以下は、EUC-JPなファイルを読み書きするサンプル。
package japanese import ( "io/ioutil" "os" "github.com/devlights/gomy/output" "golang.org/x/text/encoding/japanese" "golang.org/x/text/transform" ) // EucJpReadWrite は、EUC-JPのデータを読み書きするサンプルです. func EucJpReadWrite() error { // ------------------------------------------------------------- // Go で、日本語特有のエンコーディング (sjis や euc-jp など) を扱う場合 // 以下のパッケージを利用する. // // golang.org/x/text/encoding/japanese // // インストールは、普通に go get するだけ。 // go get golang.org/x/text/encoding/japanese // go get すると、 golang.org/x/text が依存関係として追加される. // // japanese.ShiftJIS が sjis, japanese.EUCJP が euc-jp に // 対応している。どちらも Encoder と Decoder を持っているので // それを transform.NewXXX に渡すことにより、*io.Reader or *io.Writer を // 取得することができる。 // // transform.NewReader に渡すのが Decoder // transform.NewWriter に渡すのが Encoder // // となる。 // ------------------------------------------------------------- dir, err := ioutil.TempDir("", "try-golang") if err != nil { return err } defer func() { _ = os.RemoveAll(dir) }() // ------------------------------------------------------------- // euc-jp データを書き出し // ------------------------------------------------------------- fpath, err := func() (string, error) { fp, ioErr := ioutil.TempFile(dir, "eucjp") if ioErr != nil { return "", ioErr } defer func() { _ = fp.Close() }() writer := transform.NewWriter(fp, japanese.EUCJP.NewEncoder()) _, ioErr = writer.Write([]byte("こんにちわWorld")) if ioErr != nil { return "", ioErr } return fp.Name(), nil }() if err != nil { return err } // ------------------------------------------------------------- // euc-jp データを読み出し // ------------------------------------------------------------- err = func() error { fp, ioErr := os.Open(fpath) if ioErr != nil { return ioErr } defer func() { _ = fp.Close() }() reader := transform.NewReader(fp, japanese.EUCJP.NewDecoder()) allData, ioErr := ioutil.ReadAll(reader) if ioErr != nil { return ioErr } output.Stdoutl("[eucjp]", string(allData)) return nil }() return nil }
try-golang/eucjp_readwrite.go at master · devlights/try-golang · GitHub
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場