这不是一个真正的编程问题,是否有命令行或Windows工具(Windows 7)来获取文本文件的当前编码?当然,我可以写一个小c#应用程序,但我想知道是否有一些已经内置?
当前回答
以下是我对如何通过BOM检测Unicode文本编码家族的看法。这种方法的准确性很低,因为这种方法只适用于文本文件(特别是Unicode文件),并且在没有BOM时默认为ascii(像大多数文本编辑器一样,如果你想匹配HTTP/web生态系统,默认将是UTF8)。
2018年更新:我不再推荐这种方法。我建议使用GIT中的file.exe或@Sybren推荐的*nix工具,我将在后面的回答中展示如何通过PowerShell来实现这一点。
# from https://gist.github.com/zommarin/1480974
function Get-FileEncoding($Path) {
$bytes = [byte[]](Get-Content $Path -Encoding byte -ReadCount 4 -TotalCount 4)
if(!$bytes) { return 'utf8' }
switch -regex ('{0:x2}{1:x2}{2:x2}{3:x2}' -f $bytes[0],$bytes[1],$bytes[2],$bytes[3]) {
'^efbbbf' { return 'utf8' }
'^2b2f76' { return 'utf7' }
'^fffe' { return 'unicode' }
'^feff' { return 'bigendianunicode' }
'^0000feff' { return 'utf32' }
default { return 'ascii' }
}
}
dir ~\Documents\WindowsPowershell -File |
select Name,@{Name='Encoding';Expression={Get-FileEncoding $_.FullName}} |
ft -AutoSize
建议:如果dir、ls或Get-ChildItem只检查已知的文本文件,并且只从已知的工具列表中寻找“糟糕的编码”,那么这个方法可以很好地工作。(例如SQL Management Studio默认为UTF16,这破坏了GIT auto-cr-lf for Windows,这是多年来的默认。)
其他回答
寻找一个Node.js/npm解决方案?试试encoding-checker:
npm install -g encoding-checker
使用
Usage: encoding-checker [-p pattern] [-i encoding] [-v]
Options:
--help Show help [boolean]
--version Show version number [boolean]
--pattern, -p, -d [default: "*"]
--ignore-encoding, -i [default: ""]
--verbose, -v [default: false]
例子
获取当前目录下所有文件的编码:
encoding-checker
返回当前目录下所有md文件的编码:
encoding-checker -p "*.md"
获取当前目录及其子文件夹中所有文件的编码(对于巨大的文件夹将需要相当长的时间;看似无响应):
encoding-checker -p "**"
更多示例请参考npm文档或官方存储库。
我写了第4个答案(在写作的时候)。但最近我在所有电脑上都安装了git,所以现在我使用@Sybren的解决方案。这是一个新的答案,使解决方案方便从powershell(没有把所有的git/usr/bin在PATH,这是太多的混乱对我来说)。
将此添加到您的配置文件中。
$global:gitbin = 'C:\Program Files\Git\usr\bin'
Set-Alias file.exe $gitbin\file.exe
并使用类似:file.exe——mime-encoding *。必须在命令中包含.exe,才能使PS别名正常工作。
但如果您不自定义PowerShell配置文件。ps1我建议你从我的开始:https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 并保存到~\Documents\WindowsPowerShell。在没有git的计算机上使用它是安全的,但如果找不到git,则会编写警告。
命令中的.exe也是我如何使用powershell中的C:\WINDOWS\system32\where.exe;和许多其他操作系统CLI命令是“默认隐藏”的powershell, *耸肩*。
我发现做到这一点的唯一方法是VIM或notepad++。
如果你的Windows机器上有“git”或“Cygwin”,然后转到文件所在的文件夹并执行命令:
file *
这将为您提供该文件夹中所有文件的编码细节。
这里有一些可靠的ascii、bom和utf8检测的C代码:https://unicodebook.readthedocs.io/guess_encoding.html
仅ASCII, UTF-8和编码使用BOM (UTF-7与BOM, UTF-8与BOM, UTF-16和UTF-32)有可靠的算法来获取文档的编码。 对于所有其他编码,您必须信任基于统计的启发式。
编辑:
一个powershell版本的c#答案来自:找到任何文件编码的有效方法。只适用于签名(炸弹)。
# get-encoding.ps1
param([Parameter(ValueFromPipeline=$True)] $filename)
begin {
# set .net current directoy
[Environment]::CurrentDirectory = (pwd).path
}
process {
$reader = [System.IO.StreamReader]::new($filename,
[System.Text.Encoding]::default,$true)
$peek = $reader.Peek()
$encoding = $reader.currentencoding
$reader.close()
[pscustomobject]@{Name=split-path $filename -leaf
BodyName=$encoding.BodyName
EncodingName=$encoding.EncodingName}
}
.\get-encoding chinese8.txt
Name BodyName EncodingName
---- -------- ------------
chinese8.txt utf-8 Unicode (UTF-8)
get-childitem -file | .\get-encoding
推荐文章
- 我如何找到哪个程序正在使用端口80在Windows?
- 在Windows中有像GREP这样的模式匹配实用程序吗?
- 如何在Windows命令提示符下运行.sh ?
- 如何从命令行在windows中找到mysql数据目录
- 在没有事件源注册的情况下写入Windows应用程序事件日志
- 为什么PHP的json_encode函数转换UTF-8字符串为十六进制实体?
- 无法在Windows上从/usr/local/ssl/openssl.cnf加载配置信息
- 我如何确定文件编码在OS X?
- GIT克隆在windows中跨本地文件系统回购
- 如何运行一个PowerShell脚本而不显示窗口?
- PowerShell:仅为单个命令设置环境变量
- “\d”在正则表达式中是数字吗?
- 为什么这个Windows批处理文件只执行第一行,而在命令shell中执行所有三行?
- 环境变量存储在Windows注册表的哪里?
- 有一个好的Valgrind Windows的替代品吗?