首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并Powershell中txt文件时的UTF-8编码问题

合并Powershell中txt文件时的UTF-8编码问题
EN

Stack Overflow用户
提问于 2019-11-08 09:41:52
回答 2查看 2.9K关注 0票数 0

我需要合并计算机上某个文件夹中的所有txt文件。它们有数百个,它们都有一个不同的名称,因此,为了合并文件而必须手动输入文件名的任何代码都不适用于我。文件采用"UTF-8"-encoding格式,包含不同语言的表情符号和字符(如Cyrillic脚本)以及带有重音的字符等(例如,ü,à.)。另一个堆栈溢出用户给了我下面的代码,以便在Powershell中运行:

代码语言:javascript
运行
复制
(gc *.txt) | out-file newfile.txt -encoding utf8

它非常适合合并文件。但是,它实际上给了我一个txt文件,其中包含"UTF-8和BOM"-encoding,而不是"UTF-8"-encoding。此外,所有表情符号和特殊字符都已被移除,并被替换为其他字符,例如“圣保罗”而不是"ü“。对于我正在做的事情来说,这些表情符号和特殊角色的保留是非常重要的。

有人能帮我调整一下这段代码(或者建议另一段代码),这样它就给了我一个与"UTF-8"-encoding合并的txt文件,其中仍然包含了所有的特殊字符?请记住,我是个外行。

非常感谢您的帮助和亲切的问候!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-13 13:00:41

如果没有utf8参数,PS 5 (gc)无法处理任何bom输入文件:

代码语言:javascript
运行
复制
(gc -Encoding Utf8 *.txt) | out-file newfile.txt -encoding utf8
票数 1
EN

Stack Overflow用户

发布于 2019-11-08 14:42:03

在PowerShell < 6.0中,Out-File cmdlet没有Utf8NoBOM编码。

但是,您可以使用Utf8编写不需要BOM的.NET文本文件:

以下所有方法都是通用的

代码语言:javascript
运行
复制
$rootFolder = 'D:\test'  # the path where the textfiles to merge can be found
$outFile    = Join-Path -Path $rootFolder -ChildPath 'newfile.txt'

方法1

代码语言:javascript
运行
复制
# create a Utf8NoBOM encoding object
$utf8NoBom = New-Object System.Text.UTF8Encoding $false  # $false means NoBOM
Get-Content -Path "$rootFolder\*.txt" -Encoding UTF8 -Raw | ForEach-Object {
    [System.IO.File]::AppendAllText($outFile, $_, $utf8NoBom)
}

方法2

代码语言:javascript
运行
复制
# create a Utf8NoBOM encoding object
$utf8NoBom = New-Object System.Text.UTF8Encoding $false  # $false means NoBOM
Get-ChildItem -Path $rootFolder -Filter '*.txt' -File | ForEach-Object {
    [System.IO.File]::AppendAllLines($outFile, [string[]]($_ | Get-Content -Encoding UTF8), $utf8NoBom)
}

方法3

代码语言:javascript
运行
复制
# Create a StreamWriter object which by default writes Utf8 without a BOM.
$sw = New-Object System.IO.StreamWriter $outFile, $true  # $true is for Append
Get-ChildItem -Path $rootFolder -Filter '*.txt' -File | ForEach-Object {
    Get-Content -Path $_.FullName -Encoding UTF8 | ForEach-Object {
        $sw.WriteLine($_)
    }
}
$sw.Dispose()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58764007

复制
相关文章

相似问题

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