Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2018 | 02 |

2015-08-17(Mon)

Go言語 - Shift_JISファイルの読み書き

Windowsでの使用ではSJISテキストを扱うことが多くなります。SJISファイルの読み書きには以下のパッケージを使用します。

参考サイト

Go で euc-jp や sjis の csv ファイルを読み込むには変換用のリーダーを1つかませるだけでよかった

入手先

https://github.com/golang/text

参考サイトとパッケージのパス?が違うので注意。

旧
"code.google.com/p/go.text/encoding/japanese"
"code.google.com/p/go.text/transform"

新
"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"

サンプル

package main

import (
    "golang.org/x/text/encoding/japanese"
    "golang.org/x/text/transform"
    "bufio"
    "fmt"
//  "io"
    "os"
)

func main() {
    var fp *os.File
    var err error

//  var byteBuf   []byte
//  var tooLong   bool

    //
    // Shift_JISファイルを読み込み
    //
    fp, err = os.Open("SJIS.txt")
    if err != nil {
        panic(err)
    }
//  defer fp.Close()

    sjisScanner  := bufio.NewScanner(transform.NewReader(fp, japanese.ShiftJIS.NewDecoder()))

    // 1行ずつ処理
    for sjisScanner.Scan() {
        fmt.Println(sjisScanner.Text())  // コマンドプロンプトにはShift_JISに自動でエンコードされる
    }

//  sjisReader  := bufio.NewReader(transform.NewReader(fp, japanese.ShiftJIS.NewDecoder()))
    // 1行ずつ処理
//  for {
//      byteBuf, tooLong, err := sjisReader.ReadLine()
//      if err == io.EOF {
//          break
//      } else if err != nil {
//          panic(err)
//      }
//      if tooLong {
//          panic("***Line is too Long!!***")
//      }
//      str := string(byteBuf)
//      fmt.Println(str)  // コマンドプロンプトにはShift_JISに自動でエンコードされる
//  }
    fp.Close()



    //
    // Shift_JISでファイルに書き込み
    //
    fp, err = os.OpenFile("SJIS2.txt", os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        panic(err)
    }
    defer fp.Close()
    sjisWriter  := bufio.NewWriter(transform.NewWriter(fp, japanese.ShiftJIS.NewEncoder()))

    // 以下エラー処理省略
    _, err = sjisWriter.WriteString("SJIJライトデータ1行目\n")
    _, err = sjisWriter.WriteString("SJIJライトデータ2行目\n")
    err    = sjisWriter.Flush()

//  fp.Close()

}

noborito668noborito668 2016/12/10 03:58 sjisx0213で増えた文字や全角マイナスx8171(SJIS)があるとエラーになるので、
shiftjis.goの2行書き換えとtables.goへの追加が必要かもしれません。
githib.com/murakami668/japaneseencodeに変更サンプルを置きました。
追加行はあえて「jis2008<<14」 の位置を1文字ずらしてします。

hakehake 2016/12/10 05:08 noborito668 さんコメントありがとうございます。
文字コードについては全く疎いので、こういう情報をいただけると非常に参考になります。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20150817/p1