No Windows, precisoencontre todos os arquivos em um diretório que contenha BOM UTF-8(marca de ordem de byte). Qual ferramenta pode fazer isso e como?
Pode ser um script do PowerShell, algum recurso de pesquisa avançada de editor de texto ou qualquer outra coisa.
Responder1
Aqui está um exemplo de script do PowerShell. Ele procura no C:
caminho quaisquer arquivos onde estejam os primeiros 3 bytes 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
É necessário "ReadAllBytes"? Talvez a leitura de apenas alguns primeiros bytes tivesse um desempenho melhor?
Ponto justo. Aqui está uma versão atualizada que lê apenas os primeiros 3 bytes.
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
Responder2
Como observação lateral, aqui está um script do PowerShell que uso para remover os caracteres UTF-8 BOM dos meus arquivos de origem:
$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
}
Responder3
Se você estiver em um computador corporativo (como eu) com privilégios restritos e não puder executar o script PowerShell, poderá usar um Notepad ++ portátil comPythonScriptplugin para realizar a tarefa, com o seguinte script:
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()
O crédito vai parahttps://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-using-notepad/
Responder4
Powershell testando os primeiros dois bytes. O lado direito de operadores como -eq torna-se uma string.
dir -file |
% { $utf8bom = '239 187' -eq (get-content $_.fullname -AsByteStream)[0..1]
[pscustomobject]@{name=$_.name; utf8bom=$utf8bom} }
name utf8bom
---- -------
foo False
script.ps1 True
script.ps1~ False