【问题标题】:How to escape non-ascii symbols in PowerShell 5.1?如何在 PowerShell 5.1 中转义非 ascii 符号?
【发布时间】:2020-11-07 12:29:25
【问题描述】:

我正在尝试将文件内容发送到服务器:

$uri = ...
$headers = @{
    ...
    "Content-Type" = "application/json"
}
[string] $content = Get-Content .\filename -Encoding utf8 -Raw
$body = @{
    ...
    "content" = $content
} | ConvertTo-Json
$response = Invoke-WebRequest $uri -Method 'PUT' -Headers $headers -Body $body

但是所有的非ascii符号都换成了其他类似的符号或者问号

我怎样才能摆脱它们?

我已阅读文档并且知道cmdlet ConvertTo-Json 的参数-EscapeHandling,但它可以从PowerShell 6.2 获得,我只有5.1

【问题讨论】:

  • 你可以试试"Content-Type" = "application/json; charset=utf-8" 吗?
  • @Theo,是的,我试过了,但没有帮助
  • (a) $content 在本地看起来是否正确? (b) 响应指示返回什么编码? $response.Headers['content-type']
  • @mklement0,是的,它在本地看起来正确。我看到的是西里尔符号。转换后,只有控制符号被转义。 Screenshot$response.Headers['content-type'] == "application/json"
  • @mklement0 嗯...这个脚本在 TeamCity 中运行,我在那里看到问号而不是西里尔符号...Screenshot

标签: powershell


【解决方案1】:

结果,我写了一个简单的函数:

function EscapeNonAscii([string] $s)
{
    $sb = New-Object System.Text.StringBuilder;
    for ([int] $i = 0; $i -lt $s.Length; $i++)
    {
        $c = $s[$i];
        if ($c -gt 127)
        {
            $sb = $sb.Append("\u").Append(([int] $c).ToString("X").PadLeft(4, "0"));
        }
        else
        {
            $sb = $sb.Append($c);
        }
    }
    return $sb.ToString();
}

并像这样使用它:

$updateFileResponse = Invoke-WebRequest $updateFileUri -Method 'PUT' -Headers $headers -Body (EscapeNonAscii $body)

它有帮助。对于将来会在谷歌上搜索的每个人,这是对 GitLab API 的请求 Update existing file in repository

PS:我将 PS 用作 C#,因为我非常了解它。如果有人知道如何更好地重写这个片段,请告诉我。

PPS:而且我知道StringBuilder.Append 更改了现有对象,但我在这里添加分配($sb = $sb.Append($c) 而不是简单的$sb.Append($c)),因为它将每个操作打印到控制台。如果你知道如何解决它,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2011-05-29
    • 2018-08-10
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多