1 package env
2 3 import (
4 "os"
5 "syscall"
6 7 "golang.org/x/sys/windows"
8 "golang.org/x/text/encoding/charmap"
9 )
10 11 func Getenv(s string) string {
12 var st uint32
13 env := os.Getenv(s)
14 if windows.GetConsoleMode(windows.Handle(syscall.Stdin), &st) == nil ||
15 windows.GetConsoleMode(windows.Handle(syscall.Stdout), &st) == nil ||
16 windows.GetConsoleMode(windows.Handle(syscall.Stderr), &st) == nil {
17 // detect windows console, should be skipped in cygwin environment
18 var cm charmap.Charmap
19 switch windows.GetACP() {
20 case 37:
21 cm = *charmap.CodePage037
22 case 1047:
23 cm = *charmap.CodePage1047
24 case 1140:
25 cm = *charmap.CodePage1140
26 case 437:
27 cm = *charmap.CodePage437
28 case 850:
29 cm = *charmap.CodePage850
30 case 852:
31 cm = *charmap.CodePage852
32 case 855:
33 cm = *charmap.CodePage855
34 case 858:
35 cm = *charmap.CodePage858
36 case 860:
37 cm = *charmap.CodePage860
38 case 862:
39 cm = *charmap.CodePage862
40 case 863:
41 cm = *charmap.CodePage863
42 case 865:
43 cm = *charmap.CodePage865
44 case 866:
45 cm = *charmap.CodePage866
46 case 28591:
47 cm = *charmap.ISO8859_1
48 case 28592:
49 cm = *charmap.ISO8859_2
50 case 28593:
51 cm = *charmap.ISO8859_3
52 case 28594:
53 cm = *charmap.ISO8859_4
54 case 28595:
55 cm = *charmap.ISO8859_5
56 case 28596:
57 cm = *charmap.ISO8859_6
58 case 28597:
59 cm = *charmap.ISO8859_7
60 case 28598:
61 cm = *charmap.ISO8859_8
62 case 28599:
63 cm = *charmap.ISO8859_9
64 case 28600:
65 cm = *charmap.ISO8859_10
66 case 28603:
67 cm = *charmap.ISO8859_13
68 case 28604:
69 cm = *charmap.ISO8859_14
70 case 28605:
71 cm = *charmap.ISO8859_15
72 case 28606:
73 cm = *charmap.ISO8859_16
74 case 20866:
75 cm = *charmap.KOI8R
76 case 21866:
77 cm = *charmap.KOI8U
78 case 1250:
79 cm = *charmap.Windows1250
80 case 1251:
81 cm = *charmap.Windows1251
82 case 1252:
83 cm = *charmap.Windows1252
84 case 1253:
85 cm = *charmap.Windows1253
86 case 1254:
87 cm = *charmap.Windows1254
88 case 1255:
89 cm = *charmap.Windows1255
90 case 1256:
91 cm = *charmap.Windows1256
92 case 1257:
93 cm = *charmap.Windows1257
94 case 1258:
95 cm = *charmap.Windows1258
96 case 874:
97 cm = *charmap.Windows874
98 default:
99 return env
100 }
101 if v, err := cm.NewEncoder().String(env); err == nil {
102 return v
103 }
104 }
105 return env
106 }
107