PowerShell Get-Content读取货币符号异常,求正确编码方案
解决PowerShell处理含特殊货币符号文件的编码问题
问题场景
原CSV文件包含美元($)、英镑(£)、欧元(€)等货币符号,内容示例:
337;European €;NULL; 426;British £;NULL; 337;Americain $;NULL;
使用以下PowerShell命令替换"NULL"为空字符串:
(Get-Content %OutputFile%) -replace 'NULL', '' | Out-File -encoding unicode %OutputFile%
执行后出现乱码:美元符号正常,但英镑前出现多余字符,欧元符号显示异常,输出结果:
337;ODEYEUREU;hf;Odey European €;; 426;INFLECGB;hf;Inflection Point C £;; 337;ODEYEUREU;hf;Odey European $;;
解决方案
- 问题根源:
Get-Content默认采用系统默认编码读取文件,无法正确解码非ASCII的欧元、英镑符号,导致乱码。美元符号属于ASCII字符,因此不受影响。 - 正确编码选择:
- 优先使用UTF-8编码:这是支持所有Unicode字符(包括各类货币符号)的通用编码,适配绝大多数场景。
- 若原文件是无BOM的UTF-8,PowerShell 6及以上版本可使用
-Encoding utf8NoBOM;旧版PowerShell用-Encoding UTF8也能兼容大部分情况。
- 修正后的命令:
若担心文件占用问题,可拆分命令执行:(Get-Content -Encoding UTF8 "%OutputFile%") -replace 'NULL', '' | Out-File -Encoding UTF8 "%OutputFile%"$fileContent = Get-Content -Encoding UTF8 "%OutputFile%" $fileContent -replace 'NULL', '' | Out-File -Encoding UTF8 "%OutputFile%" - 注意事项:
- 避免使用
unicode(即UTF-16LE)作为输出编码,除非原文件本身是UTF-16格式,否则会引入额外字节标记,引发新的乱码。 - 不确定原文件编码时,可通过Notepad++等工具查看文件编码类型,再对应指定
-Encoding参数。
- 避免使用
内容的提问来源于stack exchange,提问作者VyTre
相关产品推荐
相关产品推荐

