env_windows.go raw

   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