在 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

建议:如果dirlsGet-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文件损坏的问题)

java 怎么获得文件编码格式

在 Borland C++ 6 中从 Windows 获取程序文件目录

从输入表单中获取 Base64 编码文件数据

CSV 脚本的 PowerShell 获取计数器,编码问题

从 PEM BASE64 编码的私钥文件中获取 RSA 私钥