You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell文本处理中如何保留En与Em破折号编码?

解决XML文件中Dash替换后的乱码问题

核心问题分析

乱码问题主要源于两个关键点:

  1. 文件读写时的编码不匹配,导致En dash/Em dash这类特殊字符在转换过程中损坏
  2. 脚本自身编码可能不正确,使得替换语句中的dash字符无法被PowerShell正确识别

分步解决方案

1. 确保脚本文件本身编码正确

将你的PowerShell脚本保存为UTF-8带BOM格式(VS Code、Notepad++等主流编辑器均支持该选项)。如果脚本编码错误,替换语句中的—(Em dash)和–(En dash)会被解析为乱码,替换逻辑从根源上失效。

2. 正确读取XML文件

取消注释读取文件的编码指定,用UTF-8格式读取,避免系统默认ANSI编码破坏特殊字符,同时添加-Raw参数一次性读取整个文件,优化XML的换行符处理:

$fileContents = Get-Content -Encoding UTF8 $myfile -Raw

3. 优化Dash替换逻辑

将四次重复的-replace简化为一次正则匹配,覆盖所有空格/无空格的Em dash场景,减少冗余且避免遗漏:

# 替换所有Em dash(无论前后是否有空格)为带空格的En dash
$fileContents = $fileContents -replace '\s*—\s*', ' – '

正则\s*匹配0个或多个空白字符,一次性处理所有空格组合,效率更高。

4. 用正确编码写入文件

XML通常要求UTF-8无BOM格式,而PowerShell 5.1的Set-Content -Encoding UTF8会生成带BOM的文件,易导致解析器报错。推荐用.NET方法确保无BOM的UTF-8编码:

[System.IO.File]::WriteAllText($myfile, $fileContents, [System.Text.Encoding]::UTF8)

若使用PowerShell 7+,可直接用:

$fileContents | Set-Content -Encoding UTF8NoBOM $myfile

5. 完整修改后的关键代码片段

# 文件读取
$fileContents = Get-Content -Encoding UTF8 $myfile -Raw

# Dash替换逻辑优化
# 统一En dash为带空格格式
$fileContents = $fileContents -replace '\s*–\s*', ' – '
# 替换空格包裹的连字符为En dash
$fileContents = $fileContents -replace ' - ', ' – '
# 替换所有Em dash为带空格的En dash
$fileContents = $fileContents -replace '\s*—\s*', ' – '

# 文件写入(无BOM UTF-8)
[System.IO.File]::WriteAllText($myfile, $fileContents, [System.Text.Encoding]::UTF8)

验证方法

运行修改后的脚本后,用Notepad++打开处理后的XML文件:

  • 通过编码菜单确认文件编码为UTF-8无BOM
  • 检查En dash(–)显示正常,无问号、方框等乱码

内容的提问来源于stack exchange,提问作者HelenT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:55:55