eagleye

Windows PowerShell 中文字符处理解决方案

Windows PowerShell 中文字符处理解决方案文档

一、问题背景

在使用 PowerShell 发送 HTTP 请求或处理响应时,中文字符可能因编码不一致导致乱码(如请求头含中文、响应内容含中文)。本文针对控制台编码不匹配请求/响应编码未明确指定等问题,提供完整的中文字符处理方案,涵盖Invoke-WebRequest修正与curl.exe替代方案。

二、完整解决方案

方案 1:增强版Invoke-WebRequest脚本(适合复杂场景)

通过显式设置编码、捕获响应头、手动处理字节转换等步骤,确保中文字符正确显示与解析。

脚本代码与关键步骤说明:

# 1. 设置控制台输出编码为 UTF-8(核心步骤)

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 # 控制台显示编码

$OutputEncoding = [System.Text.Encoding]::UTF8 # 脚本输出编码

# 2. 定义 JWT 令牌(示例)

$token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzUxNzE3OTIwLCJpYXQiOjE3NTE3MDM1MjAsImp0aSI6IjUxMzlhYjA4Njk2ODQ2ZmZhMjcyOGUzODdjZjMzYzRkIiwidXNlcl9pZCI6IjdjODQxN2JiLTliYTMtNGVjMC04NjZiLWNhOTMyNDg0ODY5MyIsImF1ZCI6WyJ3ZWItYXBwIiwibW9iaWxlLWFwcCJdLCJpc3MiOiJzYWZlLXNlbnRyeS1hdXRoLXNlcnZpY2UifQ.G6IXXX_9NSm9tkg6v0X1BIPThQVwLCEjLzUjV8KkBp0"

try {

# 3. 发送请求并捕获响应头(用于检测实际编码)

$response = Invoke-WebRequest -Uri "http://127.0.0.1:8000/api/auth/diagnostic/" `

-Headers @{

"Authorization" = "Bearer $token"

"Content-Type" = "application/json; charset=utf-8" # 明确请求编码

"Accept-Charset" = "utf-8" # 要求响应使用 UTF-8

} `

-Method Get `

-ResponseHeadersVariable 'ResponseHeaders' # 保存响应头到变量

-UseBasicParsing # 避免依赖 IE 解析引擎(提升兼容性)

# 4. 手动处理响应内容编码(双重保障)

$content = $response.Content

# 从响应头提取编码(默认 UTF-8)

$charset = "utf-8"

if ($ResponseHeaders -and $ResponseHeaders['Content-Type'] -match 'charset=([\w-]+)') {

$charset = $matches[1] # 如响应头指定其他编码(如 GBK),自动适配

}

# 若内容为字节数组(非字符串),转换为指定编码的字符串

if ($content -isnot [string]) {

$encoding = [System.Text.Encoding]::GetEncoding($charset)

$content = $encoding.GetString($content)

}

# 5. 显示响应内容(支持中文)

Write-Host "状态码: $($response.StatusCode)" -ForegroundColor Green

Write-Host "响应内容:"

# 尝试解析 JSON(兼容非 JSON 响应)

try {

$jsonResponse = $content | ConvertFrom-Json

$jsonResponse | Format-List # 格式化显示 JSON 内容

}

catch {

Write-Host $content # 非 JSON 内容直接输出

}

}

catch {

# 6. 错误处理(支持中文错误信息)

Write-Host "请求失败: $($_.Exception.Message)" -ForegroundColor Red

# 解析错误详情(处理中文乱码)

if ($_.ErrorDetails) {

try {

$errorContent = $_.ErrorDetails.Message

# 若错误内容为字节数组,转换为 UTF-8 字符串

if ($errorContent -isnot [string]) {

$errorContent = [System.Text.Encoding]::UTF8.GetString($errorContent)

}

Write-Host "错误详情:" -ForegroundColor Red

# 尝试解析错误内容为 JSON

try {

$errorJson = $errorContent | ConvertFrom-Json

$errorJson | Format-List

}

catch {

Write-Host $errorContent -ForegroundColor Red # 非 JSON 直接输出

}

}

catch {

Write-Host "无法解析错误详情: $($_.Exception.Message)" -ForegroundColor Red

}

}

else {

Write-Host "无额外错误信息" -ForegroundColor Red

}

# 7. 显示状态码(可选)

if ($_.Exception.Response) {

Write-Host "状态码: $($_.Exception.Response.StatusCode.value__)" -ForegroundColor Red

}

}

方案 2:使用原生curl.exe(推荐,简单可靠)

Invoke-WebRequest仍存在编码问题,使用原生curl.exe可避免 PowerShell 隐式编码处理,直接保障中文字符完整性。

脚本代码与说明:

# 1. 定义 JWT 令牌(示例)

$token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzUxNzE3OTIwLCJpYXQiOjE3NTE3MDM1MjAsImp0aSI6IjUxMzlhYjA4Njk2ODQ2ZmZhMjcyOGUzODdjZjMzYzRkIiwidXNlcl9pZCI6IjdjODQxN2JiLTliYTMtNGVjMC04NjZiLWNhOTMyNDg0ODY5MyIsImF1ZCI6WyJ3ZWItYXBwIiwibW9iaWxlLWFwcCJdLCJpc3MiOiJzYWZlLXNlbnRyeS1hdXRoLXNlcnZpY2UifQ.G6IXXX_9NSm9tkg6v0X1BIPThQVwLCEjLzUjV8KkBp0"

posted on 2025-07-05 16:41  GoGrid  阅读(228)  评论(0)    收藏  举报

导航