【发布时间】:2014-04-01 14:49:36
【问题描述】:
以下情况:
- PowerShell 脚本使用 UTF-8 编码创建文件
- 用户可能会也可能不会编辑文件,可能会丢失 BOM,但应将编码保持为 UTF-8,并可能更改行分隔符
- 同一个 PowerShell 脚本读取文件,添加更多内容并将其全部以 UTF-8 格式写回同一个文件
- 这可以重复多次
对于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
运行几次后,应该在文件的开头添加新的部分,不应以任何方式更改现有内容(当前会丢失换行符),并且不应在末尾添加新的行文件(似乎有时会发生)。
相反,第二次运行给了我一个错误。
【问题讨论】:
-
我对整个编码主题不太了解,但是如果 BOM 被删除,您是否必须重新注入 BOM 才能正确读取它?我对这个问题有点困惑。为什么要删除 UTF-8 BOM?
-
我的文本编辑器很笨,将其删除。无论如何,您永远不知道文本编辑器对 UTF-8 文件做了什么。我的脚本应该足够聪明来处理它。就像 StreamReader 类一样,它做得很好。
标签: powershell encoding utf-8