要解决的问题
中文乱码往往发生在写入和读取使用了不同编码时。应先确认数据本身正确,再确认 CSV 的字段规则和编码。不要把“看起来乱码”直接当成源数据已经损坏,也不要把编号列自动转换为整数。
适用环境
PowerShell 7;Windows PowerShell 5.1 的默认编码行为有差异。示例在内存中处理,不写真实文件。
操作步骤与示例
先运行下面的小样本,再把输入替换为自己的资料;保留原始文件副本。
$csvText = [pscustomobject]@{ code='00123'; name='资料,入门' } | ConvertTo-Csv -NoTypeInformation
$joined = $csvText -join "`r`n"
$utf8 = [Text.UTF8Encoding]::new($true)
$bytes = $utf8.GetBytes($joined)
$roundtrip = $utf8.GetString($bytes) | ConvertFrom-Csv
if ($roundtrip.code -ne '00123' -or $roundtrip.name -ne '资料,入门') { throw '内容发生变化' }
'中文、编号和带逗号字段往返一致'如何判断结果
运行应报告内容往返一致。注意 UTF8Encoding 的 GetBytes 不会自动把 BOM 前缀加进数组;实际写文件时需明确输出方式。PowerShell 7 写文本可按接收方要求选择 utf8BOM 或 utf8NoBOM,不能把两者误当作不同字符集。
常见问题与排查
先检查 $PSVersionTable.PSVersion。若接收软件依赖 BOM 识别 UTF-8,选无 BOM 输出可能被误识别;若接口明确禁止 BOM,则不要添加。CSV 中引号和逗号应交给 CSV 命令处理,不手工用逗号拼接。
适用边界
本例证明样本内容编码往返不丢失,不代表任何软件都会正确识别。真实文件需要先备份,再以指定编码读取,核对首尾记录、列名及编号长度。已经被错误解码并保存的文本不能仅靠改扩展名恢复。