首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用PowerShell正确读取UTF-8文件

用PowerShell正确读取UTF-8文件
EN

Stack Overflow用户
提问于 2014-04-01 14:49:36
回答 3查看 34.6K关注 0票数 14

以下情况:

  • PowerShell脚本创建一个使用UTF-8编码的文件。
  • 用户可能编辑或不编辑文件,可能会丢失BOM,但应该保留编码为UTF-8,并可能更改行分隔符。
  • 相同的PowerShell脚本读取文件,添加更多内容,并以UTF-8的形式将其全部写入同一个文件。
  • 这可以重复多次。

使用Get-ContentOut-File -Encoding UTF8,我在正确阅读它时遇到了问题。它在它以前写的BOM (把它放在内容中,破坏了我的解析正则表达式)上是个绊脚石,它不使用UTF-8编码,甚至在原始内容部分删除行中断。

我需要一个功能,可以读取任何文件的UTF-8编码,忽略和删除BOM,而不是修改内容。我该用什么?

更新

我添加了一个测试脚本,它显示了我正在尝试做什么,以及发生了什么。

代码语言:javascript
运行
复制
# 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

在运行几次之后,应该将新的部分添加到文件的开头,不应该以任何方式更改现有的内容(当前丢失了换行符),并且不应该在文件的末尾添加额外的新行(有时似乎会发生)。

相反,第二次运行给了我一个错误。

EN

回答 3

Stack Overflow用户

发布于 2014-04-01 16:20:34

如果文件应该是UTF8,为什么不尝试读取它,解码UTF8:

代码语言:javascript
运行
复制
Get-Content -Path test.txt -Encoding UTF8
票数 31
EN

Stack Overflow用户

发布于 2014-04-01 18:19:03

JPBlanc真的是对的。如果您希望它以UTF8的形式读取,那么在读取文件时指定它。

另外,您在这里丢失了String+String内容的格式设置。更别提你的雷吉斯匹配不起作用了。查看regex搜索更改、对$newMsgs所做的更改,以及我将数据输出到文件中的方式。

代码语言:javascript
运行
复制
# 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
票数 4
EN

Stack Overflow用户

发布于 2017-02-24 08:57:03

Get-Content似乎根本不处理没有BOM的UTF-文件(如果您省略了编码-标志)。System.IO.File.ReadLines似乎是另一种选择,例如:

代码语言:javascript
运行
复制
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!
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22789415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档