問題
GoでSJISでCSVを書き出す際に"rune not supported by encoding"というエラーが発生して、CSVが正常に出力されない。
環境
go version go1.9.2 windows/amd64
コード
go
1package main 2 3import ( 4 "encoding/csv" 5 "fmt" 6 "log" 7 "os" 8 9 "golang.org/x/text/encoding/japanese" 10 "golang.org/x/text/transform" 11) 12 13const ( 14 NO_BREAK_SPACE = "\u00A0" 15 WAVE_DASH = "\u301C" 16) 17 18func main() { 19 file, err := os.Create("out.csv") 20 if err != nil { 21 log.Fatal(err) 22 panic(err) 23 } 24 defer file.Close() 25 26 writer := csv.NewWriter(transform.NewWriter(file, japanese.ShiftJIS.NewEncoder())) 27 writer.UseCRLF = true 28 29 header := []string{ 30 "header1", 31 "header2", 32 } 33 body := []string{ 34 fmt.Sprintf("あ%sい", utils.NO_BREAK_SPACE), 35 fmt.Sprintf("十時 %s 十二時", utils.WAVE_DASH), 36 } 37 38 err = writer.Write(header) 39 if err != nil { 40 log.Println(err) 41 } 42 43 err = writer.Write(body) 44 if err != nil { 45 log.Println(err) 46 } 47 48 writer.Flush() 49 err = writer.Error() 50 if err != nil { 51 log.Println(err) // encoding: rune not supported by encoding. 52 } 53}
出力されるCSV
sjisで以下のように出力されます
csv
1header1,header2 2あ
質問
上記の現象はUTF8には存在するがSJISに存在しない文字を変換した際に起こるものだと思っています。
go
1 2func main() { 3 iostr := strings.NewReader(WAVE_DASH) 4 rio := transform.NewReader(iostr, japanese.ShiftJIS.NewEncoder()) 5 ret, err := ioutil.ReadAll(rio) 6 log.Println(ret) // [] 7 log.Println(err) // encoding: rune not supported by encoding. 8}
SJISに変換する前にSJISに存在しない文字は?に置換するというのが一般的な方法だと思うのですが、nkfやiconvなどを使用せずにgoの標準ライブラリのみで対応できるのでしょうか?
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/12/25 13:33