Windows에서는 다음을 수행해야 합니다.UTF-8 BOM이 포함된 디렉터리에서 모든 파일을 찾습니다.(바이트 순서 표시). 어떤 도구가 이를 수행할 수 있으며 어떻게 할 수 있습니까?
PowerShell 스크립트, 일부 텍스트 편집기의 고급 검색 기능 등이 될 수 있습니다.
답변1
다음은 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
답변2
참고로, 소스 파일에서 UTF-8 BOM 문자를 제거하는 데 사용하는 PowerShell 스크립트는 다음과 같습니다.
$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
}
답변3
제한된 권한을 가진 기업용 컴퓨터(나 같은)를 사용하고 있고 powershell 스크립트를 실행할 수 없는 경우 다음과 같은 휴대용 Notepad++를 사용할 수 있습니다.파이썬스크립트다음 스크립트를 사용하여 작업을 수행하는 플러그인:
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/
답변4
Powershell은 처음 2바이트를 테스트합니다. -eq와 같은 연산자의 오른쪽은 문자열이 됩니다.
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