@@ -5,26 +5,22 @@ import (
5
5
"io/ioutil"
6
6
"net"
7
7
"os"
8
+ "strings"
8
9
"time"
9
10
10
- "github.com/axgle/mahonia"
11
11
"github.com/flw-cn/printer"
12
- )
13
12
14
- var (
15
- decoder mahonia.Decoder
16
- encoder mahonia.Encoder
13
+ "golang.org/x/text/encoding"
14
+ "golang.org/x/text/encoding/simplifiedchinese"
15
+ "golang.org/x/text/encoding/traditionalchinese"
16
+ "golang.org/x/text/transform"
17
17
)
18
18
19
- func init () {
20
- decoder = mahonia .NewDecoder ("GB18030" )
21
- encoder = mahonia .NewEncoder ("GB18030" )
22
- }
23
-
24
19
type Config struct {
25
20
IACDebug bool
26
21
Host string `flag:"H|mud.pkuxkx.net|服务器 {IP/Domain}"`
27
22
Port int `flag:"P|8080|服务器 {Port}"`
23
+ Encoding string `flag:"|UTF-8|服务器输出文本的 {Encoding}"`
28
24
}
29
25
30
26
type Server struct {
@@ -37,6 +33,9 @@ type Server struct {
37
33
38
34
conn net.Conn
39
35
input chan string
36
+
37
+ decoder * encoding.Decoder
38
+ encoder * encoding.Encoder
40
39
}
41
40
42
41
func NewServer (config Config ) * Server {
@@ -47,6 +46,9 @@ func NewServer(config Config) *Server {
47
46
input : make (chan string , 1024 ),
48
47
}
49
48
49
+ mud .decoder = resolveEncoding (config .Encoding ).NewDecoder ()
50
+ mud .encoder = resolveEncoding (config .Encoding ).NewEncoder ()
51
+
50
52
mud .SetOutput (mud .server )
51
53
52
54
return mud
@@ -72,7 +74,7 @@ func (mud *Server) Run() {
72
74
73
75
mud .screen .Println ("连接成功。" )
74
76
75
- netWriter := encoder .NewWriter (mud .conn )
77
+ netWriter := transform .NewWriter (mud .conn , mud . encoder )
76
78
mud .server .SetOutput (netWriter )
77
79
78
80
scanner := NewScanner (mud .conn )
@@ -87,11 +89,11 @@ LOOP:
87
89
case EOF :
88
90
break LOOP
89
91
case IncompleteLine :
90
- r := decoder .NewReader (m )
92
+ r := transform .NewReader (m , mud . decoder )
91
93
buf , _ := ioutil .ReadAll (r )
92
94
mud .input <- string (buf )
93
95
case Line :
94
- r := decoder .NewReader (m )
96
+ r := transform .NewReader (m , mud . decoder )
95
97
buf , _ := ioutil .ReadAll (r )
96
98
mud .input <- string (buf )
97
99
case IACMessage :
@@ -149,3 +151,21 @@ func (mud *Server) Stop() {
149
151
func (mud * Server ) Input () <- chan string {
150
152
return mud .input
151
153
}
154
+
155
+ func resolveEncoding (e string ) encoding.Encoding {
156
+ e = strings .ToUpper (e )
157
+ switch e {
158
+ case "GB2312" , "HZ-GB-2312" , "HZGB2312" , "EUC-CN" , "EUCCN" :
159
+ return simplifiedchinese .HZGB2312
160
+ case "GBK" , "CP936" :
161
+ return simplifiedchinese .GBK
162
+ case "GB18030" :
163
+ return simplifiedchinese .GB18030
164
+ case "BIG5" , "BIG-5" , "BIG-FIVE" :
165
+ return traditionalchinese .Big5
166
+ case "UTF8" , "UTF-8" :
167
+ return encoding .Nop
168
+ }
169
+
170
+ return encoding .Nop
171
+ }
0 commit comments