PowerShell中短横线字符比较失败的原因及解决方案
解决PowerShell中短横线字符匹配失败的问题
问题根源
你遇到的是Unicode短横线字符混淆:
- 你用来匹配的是普通减号(ASCII
45,UnicodeU+002D) - 但
$line[$i]中的是en dash(短破折号),Unicode码点为U+2013,这个字符的数值超过了单字节(Byte)的范围(0-255),所以转换时会报错。
验证方法
先确认目标字符的Unicode码点,明确差异:
# 获取$line[$i]的Unicode码点 [int]$line[$i] # 输出应为8211(对应U+2013) # 对比普通减号的码点 [int]'-' # 输出45(U+002D)
解决方法
方法1:直接匹配目标Unicode字符
用对应码点的字符进行比较:
# 方式1:通过Unicode十六进制码点构造字符 $line[$i] -eq [char]0x2013 # 方式2:直接复制调试输出中的短破折号字符(即「–」) $line[$i] -eq '–'
方法2:统一转换为标准减号
如果需要把所有类型的短横线统一为普通减号,用正则替换:
# 替换常见Unicode短横线(含U+2013、U+2014等)为普通减号 $normalizedLine = $line -replace '[\u2013\u2014\u2015]', '-' # 之后即可用普通减号匹配 $normalizedLine[$i] -eq '-'
方法3:通过字符类别匹配
如果不确定具体是哪种短横线,可匹配Unicode中所有破折号类字符:
# 判断字符是否属于破折号标点类别 $isDash = [char]::GetUnicodeCategory($line[$i]) -eq [System.Globalization.UnicodeCategory]::DashPunctuation
内容的提问来源于stack exchange,提问作者Bbb
相关产品推荐
相关产品推荐

