Open rgl opened 5 years ago
@rgl,
I'm not really versed into Windows encoding (nor UTF-16). From what I understand this code is building a pure UCS-2 (wide char) string with the topmost byte being always 0. This will indeed fail with any character > 127, which is unfortunate.
I think this can be fixed with this:
wideCmd := utf16.Encode([]rune(psCmd))
Hopefully the result will be in proper endian for the receiving machine.
Would you mind testing this, as I'm very illiterate about everything related to powershell ?
Windows uses UTF-16LE and utf16.Encode is UTF-16BE. I will submit PR soon.
Oh an I was mistaken, utf16.Encode
is really UTF-16LE! We just need to convert the result into a []byte
.
@rgl I'm lost, your PR implements a BE->LE conversion, but your last comment here seems to imply it wasn't needed. Can you elaborate?
Sorry for the confusion... the PR does not really convert from BE to LE.
Let me clarify:
utf16.Encode
converts from string
to a []uint16
encoded as UTF-16LE.encodeUtf16Le
converts from []uint16
to a []byte
encoded as UTF-16LE, making the entire conversion from string
to []byte
encoded as UTF-16LE.
Can https://github.com/masterzen/winrm/blob/1d17eaf15943ca3554cdebb3b1b10aaa543a0b7e/powershell.go#L10-L23 be changed to use a proper UTF-8 to UTF-16 (the native windows encoding) conversion?