使用Powershell替换文本文件中的扩展ascii字符

时间:2018-09-04 21:52:17

标签: powershell replace character-encoding

我需要在多个csv文件中的“”字符串中替换十六进制93字符。下面是我正在使用的代码。但是它不起作用,我认为它不起作用的原因是因为十六进制值大于7F(Dec 127)。我尝试了其他几种方法都没有用。任何帮助将不胜感激。

$q1 = [String](0x93 -as [char])
Get-ChildItem ".\*.csv" -Recurse | ForEach {
(Get-Content $_ | ForEach  { $_.replace($q1, '""') }) |
     Set-Content $_
}

注意:附件是我的测试文件的格式十六进制转储的图像。第一个字符是我需要执行替换操作的字符:enter image description here

1 个答案:

答案 0 :(得分:3)

在Windows PowerShell中,读取/写入文件时的默认字符编码为“ ANSI” ,即活动目录所隐含的旧式8位代码页系统区域设置。
(相比之下,PowerShell Core 默认为UTF-8。)

例如,与美式英语系统上的系统区域设置相关的代码页为1252,即Windows-1252,其中代码点0x93是非ASCII {{ 1}}引号。

但是,一旦将文本文件的内容读入内存, 在内存中,字符串的字符就表示为UTF-16LE代码单元,即。 NET 实例。

作为 Unicode 字符,[string]具有代码点U+201c,在UTF-16LE中表示为

因此-因为内存中所有字符串都是UTF-16LE代码单元-您需要替换的是0x201c

[char] 0x201c

请注意,$q1 = [char] 0x201c # “ Get-ChildItem *.csv -Recurse | ForEach-Object { (Get-Content $_.FullName) -replace $q1, '""' | Set-Content $_.FullName } 也使用默认的字符编码,因此重写的文件也将使用“ ANSI”编码-如果需要,请使用Set-Content参数更改输出编码。

还要注意-Encoding调用周围的(...),这可以确保我将输入文件从头到尾全部读入内存,从而可以在同一管道中写回同一文件。
虽然这种方法很方便,但是请注意,如果在完成之前中断对输入文件的写操作,则可能会造成数据丢失的风险。


将“ ANSI”代码点转换为Unicode代码点

下面显示了如何将“ Get-Content”这样的“ ANSI”(8位)代码点转换为其等效的UTF-16代码点0x93

0x201c