以下情况:
使用Get-Content和Out-File -Encoding UTF8,我在正确阅读它时遇到了问题。它在它以前写的BOM (把它放在内容中,破坏了我的解析正则表达式)上是个绊脚石,它不使用UTF-8编码,甚至在原始内容部分删除行中断。
我需要一个功能,可以读取任何文件的UTF-8编码,忽略和删除BOM,而不是修改内容。我该用什么?
更新
我添加了一个测试脚本,它显示了我正在尝试做什么,以及发生了什么。
# Read data if exists
$data = ""
$startRev = 1;
if (Test-Path test.txt)
{
$data = Get-Content -Path test.txt
if ($data -match "^[0-9-]{10} - r([0-9]+)")
{
$startRev = [int]$matches[1] + 1
}
}
Write-Host Next revision is $startRev
# Define example data to add
$startRev = $startRev + 10
$newMsgs = "2014-04-01 - r" + $startRev + "`r`n`r`n" + `
"Line 1`r`n" + `
"Line 2`r`n`r`n"
# Write new data back
$data = $newMsgs + $data
$data | Out-File test.txt -Encoding UTF8在运行几次之后,应该将新的部分添加到文件的开头,不应该以任何方式更改现有的内容(当前丢失了换行符),并且不应该在文件的末尾添加额外的新行(有时似乎会发生)。
相反,第二次运行给了我一个错误。
发布于 2014-04-01 16:20:34
如果文件应该是UTF8,为什么不尝试读取它,解码UTF8:
Get-Content -Path test.txt -Encoding UTF8发布于 2014-04-01 18:19:03
JPBlanc真的是对的。如果您希望它以UTF8的形式读取,那么在读取文件时指定它。
另外,您在这里丢失了String+String内容的格式设置。更别提你的雷吉斯匹配不起作用了。查看regex搜索更改、对$newMsgs所做的更改,以及我将数据输出到文件中的方式。
# Read data if exists
$data = ""
$startRev = 1;
if (Test-Path test.txt)
{
$data = Get-Content -Path test.txt #-Encoding UTF8
if($data -match "\br([0-9]+)\b"){
$startRev = [int]([regex]::Match($data,"\br([0-9]+)\b")).groups[1].value + 1
}
}
Write-Host Next revision is $startRev
# Define example data to add
$startRev = $startRev + 10
$newMsgs = @"
2014-04-01 - r$startRev`r`n`r`n
Line 1`r`n
Line 2`r`n`r`n
"@
# Write new data back
$newmsgs,$data | Out-File test.txt -Encoding UTF8发布于 2017-02-24 08:57:03
Get-Content似乎根本不处理没有BOM的UTF-文件(如果您省略了编码-标志)。System.IO.File.ReadLines似乎是另一种选择,例如:
PS C:\temp\powershellutf8> $a = Get-Content .\utf8wobom.txt
PS C:\temp\powershellutf8> $b = Get-Content .\utf8wbom.txt
PS C:\temp\powershellutf8> $a2 = Get-Content .\utf8wbom.txt -Encoding UTF8
PS C:\temp\powershellutf8> $a
ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ <== This doesnt seem to be right at all
PS C:\temp\powershellutf8> $b
ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ
PS C:\temp\powershellutf8> $a2
ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ
PS C:\temp\powershellutf8>
PS C:\temp\powershellutf8> $c = [IO.File]::ReadLines('.\utf8wbom.txt');
PS C:\temp\powershellutf8> $c
ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ
PS C:\temp\powershellutf8> $d = [IO.File]::ReadLines('.\utf8wobom.txt');
PS C:\temp\powershellutf8> $d
ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ <== Works!https://stackoverflow.com/questions/22789415
复制相似问题