Skip to content

Commit fa22a09

Browse files
authored
Merge pull request #34 from mudclient/feat/utf8-connection
Feat: 增加连接编码支持,默认编码从 GBK 改为 UTF-8
2 parents 6a8a0af + 7e8937f commit fa22a09

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ Flags:
154154
--ui.rttvheight int 历史查看模式下实时文本区域高度 (default 10)
155155
-H, --mud.host IP/Domain 服务器 IP/Domain (default "mud.pkuxkx.net")
156156
-P, --mud.port Port 服务器 Port (default 8080)
157+
--mud.encoding Encoding 服务器输出文本的 Encoding (default "UTF-8")
157158
--lua.enable 是否加载 Lua 机器人 (default true)
158159
-p, --lua.path path Lua 插件路径 path (default "lua")
159160
```
@@ -174,6 +175,7 @@ UI:
174175
MUD:
175176
Host: mud.pkuxkx.net
176177
Port: 8080
178+
Encoding: UTF-8
177179
Lua:
178180
Enable: true
179181
Path: lua
@@ -192,7 +194,8 @@ Lua:
192194
},
193195
"Mud": {
194196
"Host": "mud.pkuxkx.net",
195-
"Port": 8080
197+
"Port": 8080,
198+
"Encoding": "UTF-8"
196199
},
197200
"Lua": {
198201
"Enable": true,

mud/mud.go

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,22 @@ import (
55
"io/ioutil"
66
"net"
77
"os"
8+
"strings"
89
"time"
910

10-
"github.com/axgle/mahonia"
1111
"github.com/flw-cn/printer"
12-
)
1312

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"
1717
)
1818

19-
func init() {
20-
decoder = mahonia.NewDecoder("GB18030")
21-
encoder = mahonia.NewEncoder("GB18030")
22-
}
23-
2419
type Config struct {
2520
IACDebug bool
2621
Host string `flag:"H|mud.pkuxkx.net|服务器 {IP/Domain}"`
2722
Port int `flag:"P|8080|服务器 {Port}"`
23+
Encoding string `flag:"|UTF-8|服务器输出文本的 {Encoding}"`
2824
}
2925

3026
type Server struct {
@@ -37,6 +33,9 @@ type Server struct {
3733

3834
conn net.Conn
3935
input chan string
36+
37+
decoder *encoding.Decoder
38+
encoder *encoding.Encoder
4039
}
4140

4241
func NewServer(config Config) *Server {
@@ -47,6 +46,9 @@ func NewServer(config Config) *Server {
4746
input: make(chan string, 1024),
4847
}
4948

49+
mud.decoder = resolveEncoding(config.Encoding).NewDecoder()
50+
mud.encoder = resolveEncoding(config.Encoding).NewEncoder()
51+
5052
mud.SetOutput(mud.server)
5153

5254
return mud
@@ -72,7 +74,7 @@ func (mud *Server) Run() {
7274

7375
mud.screen.Println("连接成功。")
7476

75-
netWriter := encoder.NewWriter(mud.conn)
77+
netWriter := transform.NewWriter(mud.conn, mud.encoder)
7678
mud.server.SetOutput(netWriter)
7779

7880
scanner := NewScanner(mud.conn)
@@ -87,11 +89,11 @@ LOOP:
8789
case EOF:
8890
break LOOP
8991
case IncompleteLine:
90-
r := decoder.NewReader(m)
92+
r := transform.NewReader(m, mud.decoder)
9193
buf, _ := ioutil.ReadAll(r)
9294
mud.input <- string(buf)
9395
case Line:
94-
r := decoder.NewReader(m)
96+
r := transform.NewReader(m, mud.decoder)
9597
buf, _ := ioutil.ReadAll(r)
9698
mud.input <- string(buf)
9799
case IACMessage:
@@ -149,3 +151,21 @@ func (mud *Server) Stop() {
149151
func (mud *Server) Input() <-chan string {
150152
return mud.input
151153
}
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

Comments
 (0)