首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UTF8编码更改数据格式

UTF8编码更改数据格式
EN

Stack Overflow用户
提问于 2017-03-14 11:43:11
回答 2查看 954关注 0票数 2

我试图在PowerShell中获取命令的输出,并对其进行编码,然后再对其进行解码,以接收上述命令的结果,如下所示。

代码语言:javascript
复制
$enc = [system.Text.Encoding]::UTF8
$bytes = $enc.GetBytes((Invoke-Expression "net users"))
$enc.GetString($bytes)

但是,与原始的net users命令相比,结果出现了格式错误。我尝试将编码更改为ASCII和Unicode,结果仍然是错误的。

对如何维护格式有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-14 11:50:50

这个问题不是由编码引起的,而是因为PowerShell会破坏命令输出,除非您将它强制放入字符串中:

代码语言:javascript
复制
$bytes = $enc.GetBytes((Invoke-Expression "net users" | Out-String))

你不需要Invoke-Expression BTW。这也将起作用:

代码语言:javascript
复制
$bytes = $enc.GetBytes((net users | Out-String))
票数 4
EN

Stack Overflow用户

发布于 2017-03-14 13:15:35

补充Ansgar Wiechers' helpful answer

调用外部命令的以字符串的数组的形式返回输出行。

因为Encoding.GetBytes()需要一个字符串作为输入,所以数组被隐式地强制为单个字符串,在这种情况下,PowerShell使用 space 字符加入数组元素,因此原始的行格式丢失了;例如:

代码语言:javascript
复制
PS> [string] 1, 2, 3
1 2 3   # single string containing the array elements joined with spaces

在Ansgar的答案中,管道到,阻止了数组的创建,以单字符串的形式返回外部命令输出。

代码语言:javascript
复制
PS> (1, 2, 3 | Out-String | Measure-Object).Count
1          # Out-String output a single string

另一种选择是使用按需换行符()连接数组元素(您不会看到控制台中的差异,但使用这种技术可以得到一个单一的多行输出字符串):

代码语言:javascript
复制
PS> (net users) -join "`n"            # or, more robustly: [environment]::NewLine

注意:使用这种技术的,输出字符串不会有尾随的换行符,这与使用Out-String时不同。

Out-String总是附加一个尾换行符,这可能是不想要的。

或者,您可以通过设置[Console]::OutputEncoding (临时)告诉PowerShell从外部命令中期望什么样的编码:

但是,只有当您知道外部实用程序使用默认(系统的活动OEM代码页)以外的输出编码时,这才是必要的--我怀疑这对于net users来说是必要的;尽管如此,下面是它的工作方式:

代码语言:javascript
复制
$prevEnc = [Console]::OutputEncoding 
[Console]::OutputEncoding = New-Object System.Text.UTF8Encoding
$str = net users | Out-String  # `net users` output is now properly decoded as UTF-8
[Console]::OutputEncoding = $prevEnc
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42785077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档