概要
Go言語では、文字コードは基本UTF-8が扱われているので、
他の文字コードを使用したい場合は変換する必要がある。
使用するモジュール
文字コード変換処理を行うために、以下のモジュールを利用した。
- code.google.com/p/go.text/encoding/japanese
- code.google.com/p/go.text/transform
- io/ioutil
- strings
前者2つはインストールする必要がある。
go get code.google.com/p/go.text/encoding
go get code.google.com/p/go.text/encoding/japanese
UTF-8 から Shift_JIS への変換
UTF-8
からShift_JIS
に変換するコードは、以下のようになった。
package main
import (
"code.google.com/p/go.text/encoding/japanese"
"code.google.com/p/go.text/transform"
"fmt"
"io/ioutil"
"strings"
)
// UTF-8 から ShiftJIS
func utf8_to_sjis(str string) (string, error) {
iostr := strings.NewReader(str)
rio := transform.NewReader(iostr, japanese.ShiftJIS.NewEncoder())
ret, err := ioutil.ReadAll(rio)
if err != nil {
return "", err
}
return string(ret), err
}
func main() {
str := "テスト"
msg, err := utf8_to_sjis(str)
if err != nil {
panic(err)
}
fmt.Println(msg)
}
変換処理概要
tranform.NewReader
に渡すため、string
型からio.Reader
型に変換する。
iostr := strings.NewReader(str)
この変換したものをtransform.NewReader
の第一引数に渡し、
第二引数で変換文字コードを渡している。
第二引数で渡すもの。
http://godoc.org/code.google.com/p/go.text/encoding/japanese
rio := transform.NewReader(iostr, japanese.ShiftJIS.NewEncoder())
変換した結果がio.Reader
型で帰ってくるので、ioutil.ReadAll
で読み込んでいる。
ret, err := ioutil.ReadAll(rio)
変換が成功した場合は、結果をstring
型にキャストする。
return string(ret), err
その他の変換
UTF-8
とShift_JIS
、UTF-8
とEUC-JP
のそれぞれで相互変換する処理を書いたので載せておく。
package main
import (
"code.google.com/p/go.text/encoding/japanese"
"code.google.com/p/go.text/transform"
"fmt"
"io/ioutil"
"strings"
)
// UTF-8 から ShiftJIS
func utf8_to_sjis(str string) (string, error) {
ret, err := ioutil.ReadAll(transform.NewReader(strings.NewReader(str), japanese.ShiftJIS.NewEncoder()))
if err != nil {
return "", err
}
return string(ret), err
}
// ShiftJIS から UTF-8
func sjis_to_utf8(str string) (string, error) {
ret, err := ioutil.ReadAll(transform.NewReader(strings.NewReader(str), japanese.ShiftJIS.NewDecoder()))
if err != nil {
return "", err
}
return string(ret), err
}
// UTF-8 から EUC-JP
func utf8_to_eucjp(str string) (string, error) {
ret, err := ioutil.ReadAll(transform.NewReader(strings.NewReader(str), japanese.EUCJP.NewEncoder()))
if err != nil {
return "", err
}
return string(ret), err
}
// EUC-JP から UTF-8
func eucjp_to_utf8(str string) (string, error) {
ret, err := ioutil.ReadAll(transform.NewReader(strings.NewReader(str), japanese.EUCJP.NewDecoder()))
if err != nil {
return "", err
}
return string(ret), err
}
func main() {
str := "テスト"
msg, err := utf8_to_sjis(str)
if err != nil {
panic(err)
}
msg, err = sjis_to_utf8(msg)
fmt.Println(msg)
}
参考
package encoding
http://godoc.org/code.google.com/p/go.text/encoding
stringからio.Readerへの変換したい
http://qiita.com/abe00makoto/items/e01f817f3d83d60a378d
golangでIRCボットを書くときのメモ
http://www.binzume.net/diary/2014-07-08:A1