获取Windows中文件的编码

这不是一个真正的编程问题,是否有命令行或Windows工具(Windows 7)来获取文本文件的当前编码?当然,我可以写一个小c#应用程序,但我想知道是否有一些已经内置?

529065 次浏览
使用Windows自带的普通记事本打开你的文件。
当你点击“另存为…”时,它会显示文件的编码。
它看起来是这样的: enter image description here

无论默认选择的编码是什么,这就是文件的当前编码。
如果它是UTF-8,您可以将其更改为ANSI并单击保存以更改编码(或visa-反之)。
< / p >

我知道有许多不同类型的编码,但当我被告知我们的导出文件是UTF-8,他们需要ANSI时,这就是我所需要的。这是一个一次性的输出,所以记事本适合我。

供你参考:根据我的理解,我认为“Unicode”(如在记事本中列出的)是UTF-16的用词不当。
更多关于记事本的"Unicode"选项:Windows 7 - UTF-8和Unicdoe

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

以下是我对如何通过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

建议:如果dirlsGet-ChildItem只检查已知的文本文件,并且当你只从已知的工具列表中寻找“糟糕的编码”时,这可以很好地工作。(例如SQL Management Studio默认为UTF16,这破坏了GIT auto-cr-lf for Windows,这是多年来的默认。)

(Linux)命令行工具'file'可通过GnuWin32在Windows上使用:

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

如果你安装了git,它位于C:\Program Files\git\usr\bin.

例子:

C:\Users\SH\Downloads\SquareRoot>file *
_UpgradeReport_Files;         directory
Debug;                        directory
duration.h;                   ASCII C++ program text, with CRLF line terminators
ipch;                         directory
main.cpp;                     ASCII C program text, with CRLF line terminators
Precision.txt;                ASCII text, with CRLF line terminators
Release;                      directory
Speed.txt;                    ASCII text, with CRLF line terminators
SquareRoot.sdf;               data
SquareRoot.sln;               UTF-8 Unicode (with BOM) text, with CRLF line terminators
SquareRoot.sln.docstates.suo; PCX ver. 2.5 image data
SquareRoot.suo;               CDF V2 Document, corrupt: Cannot read summary info
SquareRoot.vcproj;            XML  document text
SquareRoot.vcxproj;           XML document text
SquareRoot.vcxproj.filters;   XML document text
SquareRoot.vcxproj.user;      XML document text
squarerootmethods.h;          ASCII C program text, with CRLF line terminators
UpgradeLog.XML;               XML  document text


C:\Users\SH\Downloads\SquareRoot>file --mime-encoding *
_UpgradeReport_Files;         binary
Debug;                        binary
duration.h;                   us-ascii
ipch;                         binary
main.cpp;                     us-ascii
Precision.txt;                us-ascii
Release;                      binary
Speed.txt;                    us-ascii
SquareRoot.sdf;               binary
SquareRoot.sln;               utf-8
SquareRoot.sln.docstates.suo; binary
SquareRoot.suo;               CDF V2 Document, corrupt: Cannot read summary infobinary
SquareRoot.vcproj;            us-ascii
SquareRoot.vcxproj;           utf-8
SquareRoot.vcxproj.filters;   utf-8
SquareRoot.vcxproj.user;      utf-8
squarerootmethods.h;          us-ascii
UpgradeLog.XML;               us-ascii

类似于上面用记事本列出的解决方案,如果你正在使用Visual Studio,你也可以在Visual Studio中打开文件。在Visual Studio中,您可以选择“File > Advanced Save Options…”

“Encoding:”组合框将明确地告诉您当前文件使用的是哪种编码。它比记事本列出了更多的文本编码,所以它在处理来自世界各地的各种文件时很有用。

就像记事本一样,你也可以从选项列表中更改编码,然后在点击“确定”后保存文件。你也可以通过Save As对话框中的“Save with encoding…”选项来选择你想要的编码(通过单击Save按钮旁边的箭头)。

如果你的Windows机器上有“git”或“Cygwin”,然后转到文件所在的文件夹并执行命令:

file *

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

我发现做到这一点的唯一方法是VIM或notepad++。

我写了第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配置文件。ps1我建议你从我的开始:https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 并保存到~\Documents\WindowsPowerShell。在没有git的计算机上使用它是安全的,但是当找不到git时将会写警告

命令中的. exe也是我如何使用powershell中的C:\WINDOWS\system32\where.exe;和许多其他操作系统CLI命令是“默认隐藏”的powershell, *耸肩*。

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

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

编辑:

一个c#答案的powershell版本,来自:有效的方法找到任何文件的编码。只适用于签名(炸弹)。

# 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

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

  1. 将文件拖放到firefox中
  2. 按Ctrl+I打开页面信息

文本编码将显示在“页面信息”;窗口。

enter image description here

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

附注:欲了解更多信息,请参阅文章。

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

file --mime-encoding *

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

file --mime-encoding */*

对于所有子目录中的文件

EncodingChecker

文件编码检查器是一个GUI工具,允许您验证一个或多个文件的文本编码。该工具可以显示所有选定文件的编码,或者仅显示不具有指定编码的文件的编码。

文件编码检查程序需要。net 4或更高版本才能运行。

寻找一个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或官方存储库

你可以通过打开文件位置的git bash然后运行命令file -i file_name来检查

例子

user filesData
$ file -i data.csv
data.csv: text/csv; charset=utf-8