StreamWriter编码

时间:2018-01-04 17:27:16

标签: powershell streamwriter

我正在处理一些非常大的文件来查找和替换字符串,所以我需要使用StreamReader和StreamWriter。我还需要支持多种编码。我有

$reader = [IO.StreamReader]::New("\\Mac\Support\Journal Tools\Aaron\ANSI.txt")
$writer = [IO.StreamWriter]::New("\\Mac\Support\Journal Tools\Aaron\stream.txt", $reader.CurrentEncoding)

它不会抛出任何类型的错误,但无论输出文件的源编码始终是什么' System.Text.UTF8Encoding'。显然我缺少一些基本的东西,但缺乏抛出的错误让我感到难过。

编辑:我尝试用上面的构造函数强制ASCII,就像这个

$writer = [IO.StreamWriter]::New("\\Mac\Support\Journal Tools\Aaron\stream.txt", [System.Text.ASCIIEncoding])

但仍然不知何故输出是UTF8,但没有错误。 Curriouser和curiouser。

编辑2:所以,基于评论,我尝试强制ASCII,我在这里添加了我用来查看结果文件被编码为的代码。也许那就是我出错的地方?

$reader = [IO.StreamReader]::New("\\Mac\Support\Journal Tools\Aaron\ANSI.txt")
$writer = [IO.StreamWriter]::New("\\Mac\Support\Journal Tools\Aaron\stream.txt", [System.Text.Encoding]::ASCII)

try {
    while (-not ($reader.EndOfStream)) {
        $line = $reader.ReadLine()
        $writer.WriteLine($line)
    }
}
finally {
    $reader.Close(); $reader.Dispose()
    $writer.Close(); $writer.Dispose()
}

$reader.Close(); $reader.Dispose()
$writer.Close(); $writer.Dispose()

$test = [IO.StreamReader]::New("\\Mac\Support\Journal Tools\Aaron\stream.txt")
Write-Host "$($test.CurrentEncoding)!!!"
$test.Close(); $test.Dispose()

最终我需要能够将我从.CurrentEncoding获得的文本表达式转换为构造函数的正确格式。是否有一些可用的功能,或者我将为自己的转换制作自己的表?

嗯,很奇怪。我有一个文件,我可以通过NotePad ++验证是一个UNICODE文件,但这仍然报告UTF8。

$reader = [IO.StreamReader]::New("\\Mac\Support\Journal Tools\Aaron\UNICODE.txt", $true)
Write-Host "$($reader.CurrentEncoding)"
$reader.Close(); $reader.Dispose()

然而,这个小函数正确地返回了Unicode。

function Get-PxFileEncoding {
    [CmdletBinding()]
    param ( 
        [parameter(Mandatory=$true)][String]$filePath
    )

    [Byte[]] $byte = get-content -path:$filePath -encoding:Byte -readCount:4 -totalCount:4

    if ($byte[0] -eq 0xef -and $byte[1] -eq 0xbb -and $byte[2] -eq 0xbf) { 
        $encoding = 'UTF8' 
    } elseif ($byte[0] -eq 0xfe -and $byte[1] -eq 0xff) { 
        $encoding = 'BigEndianUnicode' 
    } elseif ($byte[0] -eq 0xff -and $byte[1] -eq 0xfe) { 
         $encoding = 'Unicode' 
    } elseif ($byte[0] -eq 0 -and $byte[1] -eq 0 -and $byte[2] -eq 0xfe -and $byte[3] -eq 0xff) { 
        $encoding = 'UTF32' 
    } elseif ($byte[0] -eq 0x2b -and $byte[1] -eq 0x2f -and $byte[2] -eq 0x76) { 
        $encoding = 'UTF7'
    } else { 
        $encoding = 'ASCII' 
    }

$encoding
}

似乎这里也许是一个错误。其他人可以验证上面的3个衬垫是否为您返回Unicode? FWIW,这是一台升级到PS5的Windows 7 VM。

1 个答案:

答案 0 :(得分:0)

[System.Text.ASCIIEncoding][type]类型的对象。您需要一个编码类型的对象。试试[System.Text.Encoding]::ASCII[System.Text.ASCIIEncoding]::ASCII[System.Text.ASCIIEncoding]::new()

$writer = [IO.StreamWriter]::New("\\Mac\Support\Journal Tools\Aaron\stream.txt", [System.Text.ASCIIEncoding]::ASCII)