Как найти все файлы в каталоге, которые содержат спецификацию UTF-8 (метка порядка байтов)?

8

В Windows мне нужно найти все файлы в каталоге, который содержит спецификацию UTF-8 (метка порядка байтов). Какой инструмент может это сделать и как?

Это может быть сценарий PowerShell, функция расширенного поиска в текстовом редакторе или что-то еще.

Борек Бернард
источник

Ответы:

15

Вот пример скрипта PowerShell. Он ищет в C:пути любые файлы, где находятся первые 3 байта 0xEF, 0xBB, 0xBF.

Function ContainsBOM
{   
    return $input | where {
        $contents = [System.IO.File]::ReadAllBytes($_.FullName)
        $_.Length -gt 2 -and $contents[0] -eq 0xEF -and $contents[1] -eq 0xBB -and $contents[2] -eq 0xBF }
}

get-childitem "C:\*.*" | where {!$_.PsIsContainer } | ContainsBOM

Нужно ли "ReadAllBytes"? Может быть, чтение первых нескольких байтов будет работать лучше?

Честная оценка. Вот обновленная версия, которая читает только первые 3 байта.

Function ContainsBOM
{   
    return $input | where {
        $contents = new-object byte[] 3
        $stream = [System.IO.File]::OpenRead($_.FullName)
        $stream.Read($contents, 0, 3) | Out-Null
        $stream.Close()
        $contents[0] -eq 0xEF -and $contents[1] -eq 0xBB -and $contents[2] -eq 0xBF }
}

get-childitem "C:\*.*" | where {!$_.PsIsContainer -and $_.Length -gt 2 } | ContainsBOM
vcsjones
источник
1
Круто. Прежде чем я отмечу в качестве ответа, нужно ли "ReadAllBytes"? Может быть, чтение первых нескольких байтов будет работать лучше?
Борек Бернард
@Borek Смотрите редактировать.
vcsjones
2
Это спасло мой день! Также узнал, что get-childitem -recurseдля обработки подкаталогов, а также.
диневала
Я задавался вопросом, есть ли способ удалить спецификации с помощью приведенного выше сценария?
tom_mai78101
2

В качестве примечания, вот сценарий PowerShell, который я использую, чтобы убрать характер (ы) спецификации UTF-8 из моих исходных файлов:

$files=get-childitem -Path . -Include @("*.h","*.cpp") -Recurse
foreach ($f in $files)
{
(Get-Content $f.PSPath) | 
Foreach-Object {$_ -replace "\xEF\xBB\xBF", ""} | 
Set-Content $f.PSPath
}
Скотт Смит
источник
Я только что получил множество файлов, которые отличались только тем, что у некоторых была спецификация, а у некоторых - нет. Твой ответ был именно тем, что мне нужно, чтобы все это очистить. Спасибо!
Тевя
1

Если вы работаете на корпоративном компьютере (например, я) с ограниченными правами и не можете запустить скрипт powershell, вы можете использовать переносной Notepad ++ с плагином PythonScript для выполнения этой задачи со следующим сценарием:

import os;
import sys;
filePathSrc="C:\\Temp\\UTF8"
for root, dirs, files in os.walk(filePathSrc):
    for fn in files:
      if fn[-4:] != '.jar' and fn[-5:] != '.ear' and fn[-4:] != '.gif' and fn[-4:] != '.jpg' and fn[-5:] != '.jpeg' and fn[-4:] != '.xls' and fn[-4:] != '.GIF' and fn[-4:] != '.JPG' and fn[-5:] != '.JPEG' and fn[-4:] != '.XLS' and fn[-4:] != '.PNG' and fn[-4:] != '.png' and fn[-4:] != '.cab' and fn[-4:] != '.CAB' and fn[-4:] != '.ico':
        notepad.open(root + "\\" + fn)
        console.write(root + "\\" + fn + "\r\n")
        notepad.runMenuCommand("Encoding", "Convert to UTF-8 without BOM")
        notepad.save()
        notepad.close()

Кредит идет на https://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-using-notepad/

Хонг Лонг
источник