在Windows中获取文件的编码


206

这实际上不是编程问题,是否有命令行或Windows工具(Windows 7)获取文本文件的当前编码?当然可以编写一个小型C#应用程序,但是我想知道是否已经内置了什么?


12
标题应该是 Windows中文件的猜测编码。如果您不事先知道,您将永远无法确定。
Tom Blodget

Answers:


222

使用Windows随附的常规旧香草记事本打开文件。
单击“ 另存为... ” 时,它将显示文件的编码。
它看起来像这样: 在此处输入图片说明

无论默认选择的编码是什么,这就是您当前文件的编码。
如果是UTF-8,则可以将其更改为ANSI,然后单击“保存”以更改编码(反之亦然)。

我意识到有很多不同类型的编码,但是当我被告知导出文件为UTF-8并且需要ANSI时,这就是我所需要的。这是一次出口,所以记事本适合我。

仅供参考:根据我的理解,我认为“ Unicode ”(如记事本中所列)是UTF-16的误称。
有关记事本的“ Unicode ”选项的更多信息:Windows 7-UTF-8和Unicdoe


1
@Alex,我不使用Win-8。在执行Google搜索时,我找到了以下链接:Win-8 Notepad。我希望您能找到它,因为我向您保证,它仍然存在。
MikeTeeVee

1
谢谢,但是在Windows 8.1上绝对没有称为记事本的应用程序。在搜索中输入记事本时,将显示“编辑器”。而且它没有那种令人讨厌的下拉菜单,也没有菜单
Alex

4
该方法不适用于无法打开记事本的文件。而且达到该限制的速度比其他编辑器(如Notepad ++)快得多。我的Windows 8.1确实有记事本。看看%windir%\ system32 \ notepad.exe吗?
法比安·凯斯勒

3
记事本在Windows 8和Windows 10.存在
艾伦乙

6
至少从Windows 3开始,记事本已安装在Windows的所有版本中。
让·弗朗索瓦·Larvoire

64

Windows上可以通过GnuWin32使用(Linux)命令行工具“文件”:

http://gnuwin32.sourceforge.net/packages/file.htm

如果已安装git,则它位于C:\ Program Files \ git \ usr \ bin中。

例:

    C:\ Users \ SH \ Downloads \ SquareRoot>文件*
    _UpgradeReport_Files; 目录
    调试;目录
    持续时间.h; ASCII C ++程序文本,带有CRLF行终止符
    ipch; 目录
    main.cpp; ASCII C程序文本,带有CRLF行终止符
    Precision.txt; ASCII文本,带有CRLF行终止符
    释放; 目录
    Speed.txt; ASCII文本,带有CRLF行终止符
    SquareRoot.sdf; 数据
    SquareRoot.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文件文字
    squarerootmethods.h; ASCII C程序文本,带有CRLF行终止符
    UpgradeLog.XML; XML文件文字

    C:\ Users \ SH \ Downloads \ SquareRoot>文件--mime编码*
    _UpgradeReport_Files; 二元
    调试;二元
    持续时间.h; 美国
    ipch; 二元
    main.cpp; 美国
    Precision.txt; 美国
    释放; 二元
    Speed.txt; 美国
    SquareRoot.sdf; 二元
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; 二元
    SquareRoot.suo; CDF V2文档已损坏:无法读取摘要信息二进制文件
    SquareRoot.vcproj; 美国
    SquareRoot.vcxproj; utf-8
    SquareRoot.vcxproj.filters; utf-8
    SquareRoot.vcxproj.user; utf-8
    squarerootmethods.h; 美国
    UpgradeLog.XML; 美国

1
请注意,您可能需要git 2.x,但我没有git 1.9.5
jakub.g 2016年

对于我的文件,它说“ binary” :(
barbara.post

1
必须恢复为基本操作的命令行令人难以置信,这是2017年,但是看起来还可以。
Todd Partridge

1
就像其他答案说的那样,您也可以filecygwin中使用该命令。Windows的任何POSIX工具集都应具有file
palswim

如果您为Windows安装了git,则它包含GIT BASH(bash模拟器),而GIT BASH则包含“ file”命令。刚刚使用它,它的工作原理。在下一个答案中也提到了它
Amir Katz '18

61

如果您的Windows机器上有“ git”或“ Cygwin”,请转到文件所在的文件夹并执行以下命令:

file *

这将为您提供该文件夹中所有文件的编码详细信息。


添加到您的答案,如果你只在特定的文件感兴趣,你可以使用grep命令来筛选结果file *命令
ebram哈利勒

回答这个问题的完整命令不仅是盲目运行file命令,而是file --mime-encoding获取文件编码的完整命令
smac89,

23

我发现有用的另一个工具:https : //archive.codeplex.com/? p = encodingchecker EXE可以在这里找到


4
对分析多个文件很有帮助
Eric Bonnot 2014年

1
即使文件很大,也能立即得到答案(就像人们期望的那样)。
法比安·凯斯勒

1
在当前的Windows 10上运行
。– barbara.post

2
无法确定exe文件在该页面上的位置。链接是否过时?
克里斯多夫(Christoph)

1
@MarkDeven我已在答案中为exe添加了路径
user961954

17

这是我通过BOM来检测Unicode文本编码系列的方法。该方法的准确性很低,因为该方法仅适用于文本文件(特别是Unicode文件),并且默认为ascii不存在BOM的情况(像大多数文本编辑器一样,默认为UTF8是否要匹配HTTP / Web生态系统) )。

Update 2018我不再推荐此方法。 我建议使用@Sybren推荐的GIT或* nix工具中的file.exe,并在以后的答案中展示如何通过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

建议:如果 dirlsGet-ChildItem已知的文本文件只检查,当你只希望从工具已知名单“坏编码”。(即,SQL Management Studio的默认值为UTF16,这打破了Windows的GIT auto-cr-lf,这是多年来的默认值。)


Get-FileEncoding在我的系统上似乎不存在。它是自定义cmdlet吗?
Xavier Poinas,2015年

poshcode上有很多变体Get-FileEncoding。我什至从python和nodejs回顾了punycode,但是这个小版本的使用率是80/20(更像是99/1)。如果您要托管其他人的文件,建议您使用fileSyben的答案中的命令(stackoverflow.com/a/34766140/195755)或其他具有生产质量的Unicode解码器。
Yzorg

应该补充的是,这种方法仅在存在BOM时才有效...并非总是如此
Yepeekai

@Yepeekai最后一行是default编码(如果没有BOM)。对于XML,JSON和JavaScript,默认值为UTF8,但是您的使用情况可能会有所不同。
yzorg '18

@yzorg:但是那是一种脑筋急转的方式。您只是在向用户撒谎。至少大多数解析器会进行有根据的猜测。如果您无法猜测,只需抛出一个错误并告诉他们使用代码需要BOM,然后再使用另一个更智能的工具,因为已经存在许多此类工具。
Ed S.

7

我写了#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也是我C:\WINDOWS\system32\where.exe在powershell中使用的方式;以及许多其他Powershell * shrug *默认隐藏的OS CLI命令。


1
或者,您也可以将其file用作file.exe的别名,而不是file.exe¯\ _(ツ)_ /
¯– ferrell_io

@ferrell_io TL; DR:PS基于.NET,.NET具有File静态类,并且PS具有常见的EXE令人困惑的重载,我使用.exe来区分PS与Win EXE:dir | where Size -lt 10000vs where.exe git
yzorg '19

我使用@ferrell_io where.exe来区别于wherePS,后者是的内置别名Where-Object。示例:where.exe git* vs ls . | where Size -lt 10000
yzorg

@ferrell_io因此,我对file.exevs .NET静态类使用相同的模式,在检测编码的同一脚本中可能需要使用此模式。范例: [File]::SetCreationTime("readme.md", [DateTime]::Now)
yzorg

6

一个简单的解决方案可能是在Firefox中打开文件。

  1. 将文件拖放到firefox中
  2. 右键单击页面
  3. 选择“查看页面信息”

文本编码将出现在“页面信息”窗口中。

在此处输入图片说明

注意: 如果文件不是txt格式,只需将其重命名为txt,然后重试。

PS欲了解更多信息请参阅文章。


4

安装git(在Windows上,您必须使用git bash控制台)。类型:

file *   

对于当前目录中的所有文件,或者

file */*   

用于所有子目录中的文件



2

与上面用记事本列出的解决方案类似,如果使用的话,也可以在Visual Studio中打开文件。在Visual Studio中,可以选择“文件>高级保存选项...”。

“编码:”组合框将具体告诉您文件当前正在使用哪种编码。与Notepad相比,它列出的文本编码要多得多,因此在处理来自世界各地的各种文件以及其他文件时很有用。

就像记事本一样,您也可以从此处的选项列表中更改编码,然后在单击“确定”后保存文件。您还可以通过“另存为”对话框中的“使用编码保存...”选项来选择所需的编码(通过单击“保存”按钮旁边的箭头)。


很好,但是当我尝试使用Visual Studio打开文件时,它总是在关联的文本编辑器(此文件扩展名为Notepad ++)中打开文件。
barbara.post

我想,@ barbara.post与您的Visual Studio设置有关。我已经能够在Visual Studio中访问任何类型的任何纯文本文件。您可能已经告诉过它,只要遇到带有该扩展名的文件,便只需转到Notepad ++。至少那是我的想法。
JaykeBird

2

一些用于可靠的ascii,bom和utf8检测的C代码:https : //unicodebook.readthedocs.io/guess_encoding.html

只有使用BOM的ASCII,UTF-8和编码(带有BOM的UTF-7,带有BOM的UTF-8,UTF-16和UTF-32)才具有可靠的算法来获取文档的编码。对于所有其他编码,您必须信任基于统计信息的启发式方法。

编辑:

C#答案的Powershell版本来自: 查找任何文件的Encoding的有效方法。仅适用于签名(碎片)。

# 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

1
@jeasoft谢谢。我添加了一个修复程序来设置.net当前目录。 stackoverflow.com/questions/11246068/...
js2010

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.