如何在PowerShell脚本中正确使用非ASCII字符?
解决PowerShell处理非ASCII字符及JSON发送乱码问题
在英文Windows Server环境下,PowerShell处理含非ASCII字符的参数并转JSON时出现乱码,核心原因是脚本编码读取错误、控制台输出编码不匹配和API请求编码未明确指定,对应解决方法如下:
1. 确保脚本以UTF-8带BOM格式保存
英文环境下PowerShell默认以ASCII编码读取脚本,若脚本含非ASCII字符且保存为UTF-8无BOM,会直接导致字符解析错误。将脚本文件保存为UTF-8 with BOM格式,可让PowerShell正确识别非ASCII字符。
2. 调整控制台输出编码
默认控制台采用OEM编码(如CP437),不支持UTF-8字符显示,需手动设置输出编码为UTF-8:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
将该代码添加到脚本开头,Write-Host即可正确显示非ASCII字符。
3. 调用API时指定UTF-8编码
ConvertTo-Json生成的JSON字符串本身为UTF-16格式,但发送到API时需明确指定UTF-8编码,避免自动转换导致乱码。以Invoke-RestMethod为例:
Invoke-RestMethod -Uri "你的API地址" -Method Post -Body $JsonBody -ContentType "application/json; charset=utf-8"
修改后的完整脚本示例
# 设置控制台输出编码为UTF-8 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 function Add-TestUser ([String] $name) { $body = @{name = $name} $JsonBody = $body | ConvertTo-Json write-host $name write-host $JsonBody # 调用API时指定UTF-8编码 Invoke-RestMethod -Uri "https://your-api-endpoint" -Method Post -Body $JsonBody -ContentType "application/json; charset=utf-8" } $name = "Caissière" write-host $name Add-TestUser -name $name
执行后,控制台会正确显示Caissière,且发送到API的JSON也会保留正确的非ASCII字符。
内容的提问来源于stack exchange,提问作者Gerrit Verhaar
相关产品推荐
相关产品推荐

