PowerShell

时间:2018-01-08 13:37:47

标签: powershell character-encoding

这是一个三部分问题,都是相关的。上下文是这样的:我需要在任意文件中查找和替换,这些文件可能具有不同的编码,并且可能非常大(超过500 MB)。我当前的代码使用了Get-Content和Add-Content,它既是内存耗费又是大文件的非常高性能。

我有使用

成功识别源文件编码的代码
$reader = [IO.StreamReader]::New($sourceFile, $true)
$reader.Peek() > $null
$encoding = $reader.CurrentEncoding

结果的格式为 System.Text.UTF8Encoding

1:我相信这种形式的构造函数是我对StreamWriter

所需要的
$writer = [IO.StreamWriter]::New($tempFile, Encoding.UTF8)

我希望有一种内置的编程方式从字符串 System.Text.UTF8Encoding 获取构造函数所需的正确形式。或者我需要创建自己的哈希表或查找/替换来处理这个?

2:我在测试中使用过Encoding.UTF16,但结果文件仍然是UTF8。我最近接受过StreamReader的微妙教育,没有填充.CurrentEncoding直到某种类型的Read发生(因此上面的代码中的.Peek()),我想知道StreamWriter是否存在类似的问题?

3:我的理解是一些编码需要写入文件的结尾,但有些编码不需要。例如,在编写UTF8文件时,文件大小不匹配,直到$writer.WriteLine(" r n")被包含为最后一个WriteLine。任何人都可以指出一个参考,说明哪些编码需要什么结局?

谢谢!

更新: 我找到了this thread,这让我开始了。并且,当$reader.CurrentEncoding System.Text.UTF8Encoding 时,$encoding = New-Object $reader.CurrentEncoding $False有效,但当$reader.CurrentEncoding System.Text.UTF32Encoding 时得到关于

的错误
  

无法找到“UTF32Encoding”的重载

这看起来很奇怪,因为这不能是拼写错误或其他什么,我从文件中以编程方式获取字符串。

我认为,

This表明所有这些都应该有用。但只有第一个有效。所有其余的都会抛出Overload错误。

$encoding = New-Object System.Text.UTF8Encoding $False
$encoding = New-Object System.Text.UTF32Encoding $False
$encoding = New-Object System.Text.ASCIIEncoding $False
$encoding = New-Object System.Text.UNICODEEncoding $False

PROGRESS 因此,似乎那些New-Objects中的$ false用于-strict参数,该参数仅适用于-comObject。并且只有System.Text.UTF8Encoding用作COM对象。所有这些都使用-typeName参数,该参数没有-strict参数。所以......

$encoding = New-Object -typeName:System.Text.UTF8Encoding
$encoding = New-Object -typeName:System.Text.UTF32Encoding
$encoding = New-Object -typeName:System.Text.ASCIIEncoding
$encoding = New-Object -typeName:System.Text.UNICODEEncoding

的工作原理。另外,我将StreamWriter构造函数更改为此

$writer = [IO.StreamWriter]::New($destinationFile, $true, (New-Object $reader.CurrentEncoding))

该布尔值保持流打开。 而且......此时我觉得我有一个有效的功能!

1 个答案:

答案 0 :(得分:0)

所以,将所有内容压缩成更简洁的答案......

$reader = [IO.StreamReader]::New($sourceFile, $true)
$reader.Peek() > $null
$writer = [IO.StreamWriter]::New($destinationFile, $true, (New-Object -typeName:$reader.CurrentEncoding))

这是一种享受。

哪些编码需要特殊文件处理结束的问题仍然存在。