いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-63 (Shift-JISとEUC-JPなファイルを扱う)

概要

以下、自分用メモです。忘れない内にメモメモ。

現在、ほとんどのファイルが UTF-8 とかになっていることが多いですが

それでも、実務とかだと未だに Shift-JIS とか EUC-JP なファイルをよく見ることがあります。

Goで上記の様なエンコーディングのファイルを扱う場合は

pkg.go.dev

このパッケージを利用します。この中に エンコーダーとデコーダーがあるので

それでラップした 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


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com