PowerShell脚本Pester测试因重音字符不一致失败,如何修复?
解决Pester测试中Remove-Diacritics函数的变音符号移除问题
问题根源
你遇到的问题和字符串规范化逻辑缺失以及测试脚本编码错误直接相关:
- 当前函数里直接用
-replace "[\p{Mn}]"移除标记符号,但像é这类带变音的字符是单个Unicode复合字符,并非基础字符+独立的Mn类变音符号,导致正则无法匹配到目标内容。 - 测试脚本如果不是以UTF-8(带BOM)格式保存,字符串
Café会被错误解析成CafA©这种乱码,直接导致测试结果不符。
修复步骤
1. 修正Remove-Diacritics函数逻辑
启用你注释掉的正确代码——必须先将字符串规范化为FormD格式,把复合字符拆分为基础字符+独立的变音符号,再移除Mn类字符:
function Remove-Diacritics { param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [String]$string ) # 规范化字符串,拆分复合字符为基础字符+独立变音符号 $normalizedText = $string.Normalize([Text.NormalizationForm]::FormD) # 移除所有非间距标记(Mn类)字符 $cleanText = $normalizedText -creplace "\p{Mn}", "" return $cleanText }
2. 修正测试脚本的文件编码
将你的Pester测试脚本保存为UTF-8带BOM格式:
- PowerShell ISE:点击「文件」→「另存为」,编码选择「UTF-8」(默认带BOM)
- VS Code:点击右下角的编码标识,选择「UTF-8 with BOM」后保存
3. 重新验证测试
再次运行Pester测试,此时Café会被正确转换为Cafe,测试即可通过。
内容的提问来源于stack exchange,提问作者Franta
相关产品推荐
相关产品推荐

