在 Windows 中获取文件的编码
Posted
技术标签:
【中文标题】在 Windows 中获取文件的编码【英文标题】:Get encoding of a file in Windows 【发布时间】:2011-04-12 05:48:35 【问题描述】:这不是一个真正的编程问题,是否有命令行或 Windows 工具(Windows 7)来获取文本文件的当前编码?当然我可以写一个小 C# 应用程序,但我想知道是否已经内置了一些东西?
【问题讨论】:
您可以使用名为 Encoding Recognizer 的免费实用程序(需要 java)。你可以在mindprod.com/products2.html#ENCODINGRECOGNISER找到它 Guess Windows 中文件的编码 应该是标题。如果您不提前知道,您将永远无法确定。 【参考方案1】:使用 Windows 附带的普通老式香草记事本打开您的文件。 当您单击“另存为...”时,它将显示文件的编码。 它看起来像这样:
无论默认选择的编码是什么,这就是您当前对文件的编码。 如果是UTF-8,你可以把它改成ANSI,然后点击保存来改变编码(反之亦然)。
我意识到有许多不同类型的编码,但是当我得知我们的导出文件是 UTF-8 并且它们需要 ANSI 时,这就是我所需要的。这是一次导出,所以记事本适合我。
仅供参考:据我了解,我认为“Unicode”(如记事本中所列)是 UTF-16 的误称。 更多关于记事本的“Unicode”选项:Windows 7 - UTF-8 and Unicdoe
【讨论】:
@Alex,我不使用 Win-8。执行谷歌搜索,我找到了这个链接:Win-8 Notepad。我希望你能找到它,因为我向你保证,它还在那里。 谢谢,但在 Windows 8.1 上绝对没有名为记事本的应用程序。当您在搜索中输入记事本时,会出现“编辑器”。这也没有结束下拉菜单,也没有菜单 此方法不适用于记事本无法打开的文件。并且达到这个限制的速度比 Notepad++ 等其他编辑器快得多。我的 Windows 8.1 确实有记事本。看看 %windir%\system32\notepad.exe 可能吗? 记事本存在于 Windows 8 和 Windows 10 中。 记事本至少安装在 Windows 3 之后的所有 Windows 版本中。【参考方案2】:我发现另一个有用的工具:https://archive.codeplex.com/?p=encodingchecker EXE可以找到here
【讨论】:
对分析多个文件很有帮助 即使文件非常大(正如人们所期望的那样),也能即时回答。 适用于当前的 Windows 10。 无法确定 exe 文件在该页面上的位置。链接过时了吗? @MarkDeven 我在答案中添加了 exe 的路径【参考方案3】:以下是我如何通过 BOM 检测 Unicode 系列文本编码的方法。此方法的准确性较低,因为此方法仅适用于文本文件(特别是 Unicode 文件),并且在没有 BOM 时默认为ascii
(与大多数文本编辑器一样,如果您愿意,默认为UTF8
匹配 HTTP/web 生态系统)。
2018 年更新:我不再推荐这种方法。我推荐使用 @Sybren 和 I show how to do that via PowerShell in a later answer 推荐的 GIT 或 *nix 工具中的 file.exe。
# 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:x21:x22:x23: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,这打破了多年来默认的 Windows 的 GIT auto-cr-lf。)
【讨论】:
在 poshcode 上有 许多 个Get-FileEncoding
的变体。我什至审查了 python 和 nodejs 中的 punycode,但是这个小版本的使用率达到了 80/20(更像是 99/1)。如果您要托管其他人的文件,我建议您使用 Syben 的答案 (***.com/a/34766140/195755) 中的 file
命令或其他生产质量的 unicode 解码器。
应该补充一点,这种方法只有在 BOM 存在的情况下才有效......但情况并非总是如此
@Yepeekai 最后一行是default
编码(没有BOM时)。对于 XML、JSON 和 javascript,默认值为 UTF8,但您的情况可能会有所不同。
@yzorg:但这是一种脑残的方式。你只是在对用户撒谎。至少大多数解析器会做出有根据的猜测。如果您无法猜测,只需抛出错误并告诉他们需要 BOM 才能使用您的代码(然后使用另一个更智能的工具,因为已经存在许多工具)。
@EdS。当然,但似乎无法确定。我是运行此代码时的用户,因此它针对我的用例进行了优化(git 挂钩,或其他编码破坏 devops 工具的场景)。【参考方案4】:
(Linux) 命令行工具“文件”可通过 GnuWin32 在 Windows 上使用:
http://gnuwin32.sourceforge.net/packages/file.htm
如果你安装了 git,它位于 C:\Program Files\git\usr\bin。
例子:
C:\Users\SH\Downloads\SquareRoot>文件 * _升级报告_文件;目录 调试;目录 持续时间.h; ASCII C++ 程序文本,带有 CRLF 行终止符 ipch;目录 主要.cpp; ASCII C 程序文本,带有 CRLF 行终止符 精度.txt; ASCII 文本,带有 CRLF 行终止符 发布;目录 速度.txt; ASCII 文本,带有 CRLF 行终止符 SquareRoot.sdf;数据 平方根.sln; UTF-8 Unicode(带 BOM)文本,带 CRLF 行终止符 SquareRoot.sln.docstates.suo; PCX 版2.5 图像数据 SquareRoot.suo; CDF V2 文档,损坏:无法读取摘要信息 SquareRoot.vcproj; XML 文档文本 SquareRoot.vcxproj; XML 文档文本 SquareRoot.vcxproj.filters; XML 文档文本 SquareRoot.vcxproj.user; XML 文档文本 平方根方法.h; ASCII C 程序文本,带有 CRLF 行终止符 升级日志.XML; XML 文档文本 C:\Users\SH\Downloads\SquareRoot>file --mime-encoding * _升级报告_文件;二进制 调试;二进制 持续时间.h;美国ASCII码 ipch;二进制 主要.cpp;美国ASCII码 精度.txt;美国ASCII码 发布;二进制 速度.txt;美国ASCII码 SquareRoot.sdf;二进制 平方根.sln; UTF-8 SquareRoot.sln.docstates.suo;二进制 SquareRoot.suo; CDF V2 文档,损坏:无法读取摘要信息二进制文件 SquareRoot.vcproj;美国ASCII码 SquareRoot.vcxproj; UTF-8 SquareRoot.vcxproj.filters; UTF-8 SquareRoot.vcxproj.user; UTF-8 平方根方法.h;美国ASCII码 升级日志.XML;美国ASCII码【讨论】:
请注意,您可能需要 git 2.x,我没有 git 1.9.5 对于我的文件它说“二进制”:( 难以置信必须恢复到命令行进行基本操作,这是 2017 年,但看起来还可以。 就像the other answer说的,你也可以在cygwin中使用file
命令。任何适用于 Windows 的 POSIX 工具集都应该有 file
。
如果你为 windows 安装了 git,它包括 GIT BASH(bash 模拟器),它又包括 'file' 命令。刚刚使用它,它的工作原理。在下一个答案中也提到了...【参考方案5】:
与上面列出的使用记事本的解决方案类似,您也可以在 Visual Studio 中打开该文件(如果您正在使用该文件)。在 Visual Studio 中,您可以选择“文件 > 高级保存选项...”
“编码:”组合框会明确告诉您文件当前使用的是哪种编码。它比记事本列出了更多的文本编码,因此在处理来自世界各地的各种文件时非常有用。
就像记事本一样,您也可以从那里的选项列表中更改编码,然后在点击“确定”后保存文件。您还可以通过“另存为”对话框中的“使用编码保存...”选项选择所需的编码(通过单击“保存”按钮旁边的箭头)。
【讨论】:
很好,但是当我尝试使用 Visual Studio 打开文件时,它总是在相关的文本编辑器中打开文件(这种文件扩展名为 Notepad++)。 @barbara.post 我认为这与您的 Visual Studio 设置有关。我已经能够在 Visual Studio 中访问任何类型的任何纯文本文件。您可能已经告诉它只要遇到具有该扩展名的文件时就转到 Notepad++。至少这是我的想法。【参考方案6】:如果您的 Windows 机器上有“git”或“Cygwin”,请转到您的文件所在的文件夹并执行命令:
file *
这将为您提供该文件夹中所有文件的编码详细信息。
【讨论】:
添加到您的答案中,如果您只对特定文件感兴趣,可以使用grep command 过滤file *
命令的结果
不只是盲目地运行文件命令,回答这个问题的完整命令是file --mime-encoding
来获取文件的编码
2020年,问题不再是cygwin了,是wsl还是wsl2。 Cygwin 快死了。
在 2021 年,这可以在 git-bash(也就是“Git for Windows”附带的 shell)中工作。它使用 MinGW,而不是 Cygwin。【参考方案7】:
我发现这样做的唯一方法是 VIM 或 Notepad++。
【讨论】:
不幸的是它们不是“内置”工具【参考方案8】:我写了第 4 个答案(在撰写本文时)。但最近我在所有计算机上都安装了 git,所以现在我使用 @Sybren 的解决方案。这是一个新的答案,它使该解决方案在 powershell 中很方便(没有将所有 git/usr/bin 放在 PATH 中,这对我来说太混乱了)。
将此添加到您的profile.ps1
:
$global:gitbin = 'C:\Program Files\Git\usr\bin'
Set-Alias file.exe $gitbin\file.exe
并且像这样使用:file.exe --mime-encoding *
。您必须在命令中包含 .exe 才能使 PS 别名起作用。
但是如果你不自定义你的 PowerShell profile.ps1 我建议你从我的开始:https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0
并将其保存到~\Documents\WindowsPowerShell
。在没有 git 的电脑上使用是安全的,但是在找不到 git 的时候会写警告。
命令中的.exe也是我在powershell中使用C:\WINDOWS\system32\where.exe
的方式;以及许多其他被 powershell “默认隐藏”的 OS CLI 命令,*shrug*。
【讨论】:
或者你可以使用file
作为file.exe的别名而不是file.exe
¯\_(ツ)_/¯
@ferrell_io TL;DR:PS 基于 .NET 并且 .NET 具有 File 静态类,并且 PS 与常见的 EXE 有足够令人困惑的重载,我使用 .exe 来区分 PS 和 Win EXE:@ 987654329@ 与 where.exe git
.
@ferrell_io 我使用where.exe
与PS 中的where
区分开来,后者是Where-Object
的内置别名。示例:where.exe git*
与 ls . | where Size -lt 10000
@ferrell_io 所以我对file.exe
与 .NET 静态类使用相同的模式,您可能需要在检测编码的同一脚本中使用相同的模式。示例:[File]::SetCreationTime("readme.md", [DateTime]::Now)
.【参考方案9】:
这里有一些用于可靠 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)具有可靠的算法来获取文档的编码。 对于所有其他编码,您必须信任基于统计的启发式算法。
编辑:
来自Effective way to find any file's Encoding 的 C# 答案的 powershell 版本。仅适用于签名(bom)。
# 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
【讨论】:
@jeasoft 谢谢。我添加了一个修复来设置 .net 当前目录。 ***.com/questions/11246068/…【参考方案10】:一个简单的解决方案可能是在 Firefox 中打开文件。
-
将文件拖放到 Firefox 中
右击页面
选择“查看页面信息”
文本编码将出现在“页面信息”窗口中。
注意:如果文件不是txt格式,只需将其重命名为txt,然后重试即可。
附:有关详细信息,请参阅this 文章。
【讨论】:
【参考方案11】:安装 git(在 Windows 上你必须使用 git bash 控制台)。类型:
file --mime-encoding *
对于当前目录中的所有文件,或者
file --mime-encoding */*
所有子目录中的文件
【讨论】:
文档链接:linux.die.net/man/1/file【参考方案12】:EncodingChecker
文件编码检查器是一种 GUI 工具,可让您验证一个或多个文件的文本编码。该工具可以显示所有选定文件的编码,或仅显示没有您指定编码的文件。
文件编码检查器需要 .NET 4 或更高版本才能运行。
【讨论】:
【参考方案13】:正在寻找 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 docu或官方repository。
【讨论】:
以上是关于在 Windows 中获取文件的编码的主要内容,如果未能解决你的问题,请参考以下文章
python使用adb获取Android Phone截图(解决Windows传输编码导致png文件损坏的问题)