実現したい機能
Shift-JIS
EUC-JP
ISO-2022-JP
等の文字コードであるstringをGo内部で扱えるよう UTF-8
にデコードする。
実装
文字コードが既に分かっている場合の変換は以下の手順で実現できる。
- 入力stringのcharsetに応じたdecoderを取得
- decoderを用いてstringをUTF-8にdecode
package main
import (
"errors"
"fmt"
"golang.org/x/net/html/charset"
"golang.org/x/text/transform"
)
// Converts the specified charset to UTF-8.
func Decode(src []byte, charSet string) (string, error) {
e, _ := charset.Lookup(charSet)
if e == nil {
return string(src), errors.New(fmt.Sprintf("invalid charset [%s]", charSet))
}
decodeStr, _, err := transform.Bytes(
e.NewDecoder(),
src,
)
if err != nil {
return string(src), err
}
return string(decodeStr), nil
}
使い方
func TestDecode(t *testing.T) {
t.Run("SJIS -> UTF-8", func(t *testing.T) {
src := <SJIS byte slice>
// encodingの指定は"sjis"や"Shift_JIS"でも可
decoded, err := Decode(src, "shift_jis")
fmt.Println(decoded)
})
}
その他
今回のソースコードは以下に置いておきます。
https://github.com/tomtwinkle/go-encoding-decoder