From 960d4b987c9439cd77bbbdee744d224eb8b36824 Mon Sep 17 00:00:00 2001 From: MacRat Date: Sat, 24 Dec 2022 18:41:23 +0900 Subject: [PATCH] refactor(scheme): simplify text decoder --- internal/scheme/textdecode/locale_unix.go | 6 ++---- internal/scheme/textdecode/locale_windows.go | 16 +++++++--------- internal/scheme/textdecode/textdecode.go | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/internal/scheme/textdecode/locale_unix.go b/internal/scheme/textdecode/locale_unix.go index 32f3c8d4..34692387 100644 --- a/internal/scheme/textdecode/locale_unix.go +++ b/internal/scheme/textdecode/locale_unix.go @@ -7,7 +7,5 @@ import ( "golang.org/x/text/encoding/unicode" ) -// localeDecoder in Unix OS always returns UTF8 decoder. -func localeDecoder() decoder { - return unicode.UTF8.NewDecoder() -} +// localeDecoder in Unix OS is an UTF8 decoder. +var localeDecoder decoder = unicode.UTF8.NewDecoder() diff --git a/internal/scheme/textdecode/locale_windows.go b/internal/scheme/textdecode/locale_windows.go index 4b60985e..69dee8ad 100644 --- a/internal/scheme/textdecode/locale_windows.go +++ b/internal/scheme/textdecode/locale_windows.go @@ -14,8 +14,11 @@ import ( "golang.org/x/text/encoding/unicode" ) -var ( - windowsCodePages = map[uint32]encoding.Encoding{ +// localeDecoder in Windows is a decoder for UTF8 or local charset that set by locale settings in OS. +var localeDecoder decoder + +func init() { + enc, ok := map[uint32]encoding.Encoding{ 1200: unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), 1201: unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), 65001: unicode.UTF8, @@ -41,15 +44,10 @@ var ( 950: traditionalchinese.Big5, 54936: simplifiedchinese.GB18030, - } -) - -// localeDecoder in Windows returns decoder for UTF8 or local charset that set by locale settings in OS. -func localeDecoder() decoder { - enc, ok := windowsCodePages[windows.GetACP()] + }[windows.GetACP()] if !ok { enc = unicode.UTF8 } - return utf8Override{enc.NewDecoder()} + localeDecoder = utf8Override{windowsEncoder} } diff --git a/internal/scheme/textdecode/textdecode.go b/internal/scheme/textdecode/textdecode.go index 1c5cb49a..db083c44 100644 --- a/internal/scheme/textdecode/textdecode.go +++ b/internal/scheme/textdecode/textdecode.go @@ -11,7 +11,7 @@ type decoder interface { // Bytes decodes []byte to string. func Bytes(b []byte) (string, error) { - dec := localeDecoder() + dec := localeDecoder b, dec = bomOverride(b, dec) s, err := dec.Bytes(b) if err != nil {