使用PowerShell批量替换CSV字符串后符号与Emoji变问号,如何解决?
解决PowerShell批量替换CSV时Emoji/特殊符号变问号的问题
问题核心是默认编码不支持Unicode字符:Get-Content和Set-Content默认使用系统本地编码(通常是ANSI),这种编码无法识别Emoji及大部分非ASCII特殊符号,读取或写入时会将其替换为问号。
修改后的脚本
直接在读取和写入时指定UTF-8编码即可解决:
$DirPath = "C:\Users\Documents\*.csv" Get-ChildItem $DirPath -Recurse | ForEach-Object { Get-Content $_ -Encoding UTF8 | ForEach-Object { $_ -Replace 'X','Y' } | Set-Content $_ -Encoding UTF8 }
关键说明
-Encoding UTF8:强制以UTF-8编码读取和写入文件,UTF-8支持所有Unicode字符(包括Emoji)。- 改用
-Replace而非字符串的.Replace():两者功能相近,但-Replace是PowerShell原生正则替换命令,更适配批量文本处理场景。
版本适配补充
- PowerShell 7及以上:若需生成不带BOM(字节顺序标记)的UTF-8文件,可替换为
-Encoding UTF8NoBOM,避免部分程序读取时出现异常。 - 原文件为其他Unicode编码:如果CSV原本是UTF-16等编码,需先匹配原编码读取,再转成目标编码写入。例如原文件是UTF-16:
Get-Content $_ -Encoding Unicode | ForEach-Object { $_ -Replace 'X','Y' } | Set-Content $_ -Encoding UTF8
内容的提问来源于stack exchange,提问作者Isa
相关产品推荐
相关产品推荐

