Проблема с кодировкой UTF-8 при объединении текстовых файлов в Powershell - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно объединить все txt-файлы в определенной папке на моем компьютере. Их сотни, и все они имеют разные имена, поэтому любой код, в котором вам приходилось вручную вводить имена файлов, чтобы объединить их, не работал для меня. Файлы находятся в кодировке UTF-8 и содержат смайлики и символы из разных языков (например, кириллицу), а также символы с акцентами и т. Д. (Например, é, ü, à ...). Один из пользователей stackoverflow-пользователя был так любезен, что дал мне следующий код для запуска в Powershell:

(gc *.txt) | out-file newfile.txt -encoding utf8

Он прекрасно работает для объединения файлов. Однако на самом деле он дает мне txt-файл с кодировкой "UTF-8 с BOM", а не с кодировкой "UTF-8". Кроме того, все смайлики и специальные символы были удалены и заменены на другие, такие как «¼» вместо «ü». Для того, что я делаю, очень важно, чтобы эти смайлики и специальные символы остались.

Может ли кто-нибудь помочь мне с настройкой этого кода (или предложением другого), чтобы он дал мне объединенный txt-файл с "UTF"-8 "-кодирование, которое все еще содержит все специальные символы? Пожалуйста, имейте в виду, что я мирянин.

Большое спасибо заранее за помощь и добрые пожелания!

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

В PowerShell <6.0 командлет <code>Out-File не имеет кодировки Utf8NoBOM.
Однако вы можете писать текстовые файлы Utf8 без спецификации, используя .NET:

Общее для всех методов ниже

$rootFolder = 'D:\test'  # the path where the textfiles to merge can be found
$outFile    = Join-Path -Path $rootFolder -ChildPath 'newfile.txt'

Метод 1

# 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

# 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

# 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()
0 голосов
/ 13 ноября 2019

PS 5 (gc) не может обрабатывать utf8 без входных файлов без параметра -encoding:

(gc -Encoding Utf8 *.txt) | out-file newfile.txt -encoding utf8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...