diff --git a/encodedbytes/converter.go b/encodedbytes/converter.go new file mode 100644 index 0000000..a718ecb --- /dev/null +++ b/encodedbytes/converter.go @@ -0,0 +1,78 @@ +package encodedbytes + +import ( + "golang.org/x/text/transform" + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/unicode" + "bytes" + "io/ioutil" +) + +type ( + Converter struct { + from string + to string + } +) + +func resolveEncoding(b []byte, name string) encoding.Encoding { + switch name { + case "UTF-8": + return nil + case "UTF-16": + if b == nil || len(b) < 2 { + return unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) + } else if b[0] == 0xFE && b[1] == 0xFF { + return unicode.UTF16(unicode.BigEndian, unicode.ExpectBOM) + } else if b[0] == 0xFF && b[1] == 0xFE { + return unicode.UTF16(unicode.LittleEndian, unicode.ExpectBOM) + } else { + return unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) + } + case "UTF-16LE": + return unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM) + case "UTF-16BE": + return unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) + case "ISO-8859-1": + return charmap.Windows1252 + } + return nil +} + +func (c Converter) ConvertString(s string) (string, error) { + var native []byte + + b := []byte(s) + + fromEncoding := resolveEncoding(b, c.from) + if fromEncoding != nil { + in := bytes.NewReader(b) + reader := transform.NewReader(in, fromEncoding.NewDecoder()) + n, err := ioutil.ReadAll(reader) + if err != nil { + return "", err + } + native = n + } else { + native = b + } + + toEncoding := resolveEncoding(nil, c.to) + if toEncoding != nil { + out := &bytes.Buffer{} + writer := transform.NewWriter(out, toEncoding.NewEncoder()) + defer writer.Close() + _, err := writer.Write(native) + if err != nil { + return "", err + } + return string(out.Bytes()), nil + } else { + return string(native), nil + } +} + +func NewConverter(from string, to string) (*Converter, error) { + return &Converter{from:from, to:to}, nil +} diff --git a/encodedbytes/util.go b/encodedbytes/util.go index 766596c..84290cd 100644 --- a/encodedbytes/util.go +++ b/encodedbytes/util.go @@ -6,7 +6,6 @@ package encodedbytes import ( "bytes" "errors" - iconv "github.com/djimenez/iconv-go" ) const ( @@ -28,15 +27,15 @@ var ( {Name: "UTF-16BE", NullLength: 2}, {Name: "UTF-8", NullLength: 1}, } - Decoders = make([]*iconv.Converter, len(EncodingMap)) - Encoders = make([]*iconv.Converter, len(EncodingMap)) + Decoders = make([]*Converter, len(EncodingMap)) + Encoders = make([]*Converter, len(EncodingMap)) ) func init() { n := EncodingForIndex(NativeEncoding) for i, e := range EncodingMap { - Decoders[i], _ = iconv.NewConverter(e.Name, n) - Encoders[i], _ = iconv.NewConverter(n, e.Name) + Decoders[i], _ = NewConverter(e.Name, n) + Encoders[i], _ = NewConverter(n, e.Name) } } diff --git a/id3_test.go b/id3_test.go index b5d78b7..527170d 100644 --- a/id3_test.go +++ b/id3_test.go @@ -50,7 +50,7 @@ func TestOpen(t *testing.T) { actual := resultFrame.Description() if expected != actual { - t.Errorf("Expected %q, got %q", expected, actual) + t.Errorf("Expected %x, got %x", expected, actual) } actual = resultFrame.Text() diff --git a/v2/frame.go b/v2/frame.go index d83f682..0f0672f 100644 --- a/v2/frame.go +++ b/v2/frame.go @@ -8,7 +8,7 @@ import ( "encoding/binary" "errors" "fmt" - "github.com/mikkyang/id3-go/encodedbytes" + "github.com/jcs/id3-go/encodedbytes" ) const ( diff --git a/v2/id3v2.go b/v2/id3v2.go index 52d74a7..318b9c9 100644 --- a/v2/id3v2.go +++ b/v2/id3v2.go @@ -5,7 +5,7 @@ package v2 import ( "fmt" - "github.com/mikkyang/id3-go/encodedbytes" + "github.com/jcs/id3-go/encodedbytes" "io" "os" ) diff --git a/v2/id3v22.go b/v2/id3v22.go index b1b224b..bbad28e 100644 --- a/v2/id3v22.go +++ b/v2/id3v22.go @@ -4,7 +4,7 @@ package v2 import ( - "github.com/mikkyang/id3-go/encodedbytes" + "github.com/jcs/id3-go/encodedbytes" "io" ) diff --git a/v2/id3v23.go b/v2/id3v23.go index f9a5882..aae4d2a 100644 --- a/v2/id3v23.go +++ b/v2/id3v23.go @@ -4,7 +4,7 @@ package v2 import ( - "github.com/mikkyang/id3-go/encodedbytes" + "github.com/jcs/id3-go/encodedbytes" "io" )