【问题标题】:Powershell , JSON and UTF8 with cyrrylic problemsPowershell , JSON 和 UTF8 带有 cyrrylic 问题
【发布时间】:2017-03-14 15:35:42
【问题描述】:

我有一些带有 JSON 的网站。 JSON 在 utf8 代码页中(如在 RFC 中)

Web 服务器回答:Content-Type:application/json;字符集=utf-8

我需要转换它并发送给 scom 代理。一切都很好,除了 powershell 将任何西里尔符号破坏为“?”

$api = New-Object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)


$browser = New-Object System.Net.WebClient
$browser.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials 

$rowdata = Invoke-WebRequest 'https://monitoring.net/monitoring.json' -UseBasicParsing

$jsondata = ConvertFrom-Json $rowdata


foreach ($urls in $jsondata.monitors) 
{
    $instance = $discoveryData.CreateClassInstance("$MPElement[Name='58MCLibrary!F.058MC.Json.Url.Class']$")

    $instance.AddProperty("$MPElement[Name='058MCLibrary!058MC.Json.Url.Class']/Name$", $urls.name)               
    $instance.AddProperty("$MPElement[Name='58MCLibrary!058MC.Json.Url.Class']/Resource$", $urls.resource) 
    $instance.AddProperty("$MPElement[Name='058MCLibrary!058MC.Json.Url.Class']/Description$", $urls.description) 


    $discoveryData.AddInstance($instance)


}

$discoveryData

故事是 $urls.name 和 $urls.resource 没问题 - 里面没有 cyrrylic

但是 $urls.description 看起来像 Description ????????????????, ?????????????????? ?????? ???????????? ????????? ?????????????????????

有什么办法解决吗?我尝试将 .NET 的默认 env 代码页设置为 utf8 - 没有更改...

在PS中看到代码页问题很奇怪...

【问题讨论】:

  • 如果你只做$urls.description | Add-Content test.txt -Encoding UTF8 会破坏测试文件吗?
  • 是的,都一样
  • “我尝试将 .NET 的默认 env 代码页设置为 utf8 - 没有更改...”您为此使用了哪些命令?请您提供一个简短的列表吗?
  • 旁注:Powershell 是美丽的生物。不幸的是,有时它是一种有缺陷的美丽生物。如果您尝试使用除 UCS-2 LE(LE = Little Endian)以外的任何编码的字符串,它可能会非常苛刻且难以使用。旁注 - 在 microsoft-speak UCS-2 LE 中称为“Unicode”,UCS-2 BE 称为“BigEndianUnicode”。 UCS-2 非常接近 UTF-16。 “Unicode”的这种非标准使用是由于历史原因 - .NET 在 Unicode 成熟之前采用了这种编码。微软的 M-“Unicode”比 UTF-8 更早。
  • 示例文件 - rgho.st/7dGqs2MK8 ..它是 100% 的 UTF8

标签: .net json powershell


【解决方案1】:

$rowdata = Invoke-WebRequest '123/monitoring.json' -UseBasicParsing

$utf8_ready_data = [system.Text.Encoding]::UTF8.GetString($rowdata.RawContentStream.ToArray());

看起来 Invoke-WebRequest 在 2016 年讨厌 utf8..

【讨论】:

  • 是的,Msoft 选择了那个开发分支,这真是令人遗憾。如果他们在 1995-2000 年左右迈出一步,以 UTF-8 为中心……我们将拥有一个很棒的工作环境。唉。那个“Unicode”可能很麻烦。但情况可能更糟。至少他们是一致的。
猜你喜欢
  • 2012-08-20
  • 1970-01-01
  • 2018-09-27
  • 2012-05-16
  • 2014-05-25
  • 2019-02-09
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多