我需要在多个csv文件中的“”字符串中替换十六进制93字符。下面是我正在使用的代码。但是它不起作用,我认为它不起作用的原因是因为十六进制值大于7F(Dec 127)。我尝试了其他几种方法都没有用。任何帮助将不胜感激。
$q1 = [String](0x93 -as [char])
Get-ChildItem ".\*.csv" -Recurse | ForEach {
(Get-Content $_ | ForEach { $_.replace($q1, '""') }) |
Set-Content $_
}
答案 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