Получить кодировку файла в Windows - PullRequest
162 голосов
/ 14 сентября 2010

Это на самом деле не вопрос программирования, есть ли командная строка или инструмент Windows (Windows 7) для получения текущей кодировки текстового файла? Конечно, я могу написать небольшое приложение на C #, но я хотел знать, есть ли что-то уже встроенное?

Ответы [ 10 ]

180 голосов
/ 20 ноября 2012

Откройте ваш файл, используя обычный старый ванильный блокнот, который поставляется с Windows.Он покажет вам кодировку файла, когда вы нажмете " Сохранить как ... ".Это будет выглядеть так: enter image description here

Независимо от того, какая кодировка выбрана по умолчанию, это ваша текущая кодировка для файла.Если это UTF-8, вы можете изменить его на ANSI и нажать «Сохранить», чтобы изменить кодировку (или наоборот).

Я понимаю, что существует много разных типов кодирования, но это было все, что мне было нужно, когда мне сообщили, что наши экспортные файлы были в UTF-8, и они требовали ANSI.Это был разовый экспорт, поэтому Notepad мне подходит.

К вашему сведению: я думаю, что « Unicode » (как указано в «Блокноте») является неправильным обозначением UTF-16.Подробнее о параметре « Unicode » в блокноте: Windows 7 - UTF-8 и Unicdoe

50 голосов
/ 13 января 2016

Средство командной строки (Linux) 'file' доступно в Windows через GnuWin32:

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

Если у вас установлен git, он находится в C: \ Program Files\ мерзавец \ 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
46 голосов
/ 19 апреля 2017

Если на вашем Windows-компьютере есть «git» или «Cygwin», перейдите в папку, где находится ваш файл, и выполните команду:

file *

Это даст вам сведения о кодировкевсе файлы в этой папке.

21 голосов
/ 09 января 2013

Еще один инструмент, который я нашел полезным: https://archive.codeplex.com/?p=encodingchecker EXE можно найти здесь

17 голосов
/ 22 января 2015

Вот мой пример того, как определять семейство текстовых кодировок Unicode через BOM.Точность этого метода низкая, так как этот метод работает только с текстовыми файлами (в частности, с файлами Unicode), и по умолчанию он равен ascii, когда нет спецификаций (как большинство текстовых редакторов, по умолчанию будет UTF8, если вы хотитесоответствует HTTP / веб-экосистеме).

Обновление 2018 : Я больше не рекомендую этот метод. Я рекомендую использовать file.exe из GIT или * nix tools в соответствии с рекомендациями@Sybren и Я покажу, как это сделать с помощью 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 для Windows, которое было по умолчанию в течение многих лет.)

5 голосов
/ 18 октября 2017

Я написал ответ № 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 *.

3 голосов
/ 07 мая 2011

Вы можете использовать бесплатную утилиту под названием Encoding Recognizer (требуется Java).Вы можете найти его на http://mindprod.com/products2.html#ENCODINGRECOGNISER

2 голосов
/ 11 октября 2016

Аналогично решению, указанному выше для Notepad, вы также можете открыть файл в Visual Studio, если вы его используете. В Visual Studio вы можете выбрать «Файл> Дополнительные параметры сохранения ...»

В поле со списком «Кодировка:» будет указано, какая именно кодировка используется для файла. Он содержит намного больше текстовых кодировок, чем Блокнот, поэтому он полезен при работе с различными файлами со всего мира и всем остальным.

Как и в «Блокноте», вы также можете изменить кодировку из списка параметров, а затем сохранить файл после нажатия «ОК». Вы также можете выбрать нужную кодировку с помощью параметра «Сохранить с кодировкой ...» в диалоговом окне «Сохранить как» (нажав стрелку рядом с кнопкой «Сохранить»).

0 голосов
/ 08 ноября 2018

Здесь немного C-кода для надежного обнаружения ascii, bom's и utf8: https://unicodebook.readthedocs.io/guess_encoding.html

Только ASCII, UTF-8 и кодировки с использованием спецификации (UTF-7 с спецификацией, UTF-8 с спецификацией, UTF-16 и UTF-32) имеют надежные алгоритмы для получения кодировки документа. Для всех остальных кодировок вы должны доверять эвристике, основанной на статистике.

EDIT:

Версия PowerShell ответа C # от: Эффективный способ найти кодировку любого файла . Работает только с подписями (бомбы).

# encoding.ps1
param([Parameter(ValueFromPipeline=$True)] $filename)      
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}
}


PS C:\> .\encoding.ps1 chinese8.txt

Name         BodyName EncodingName
----         -------- ------------
chinese8.txt utf-8    Unicode (UTF-8)
0 голосов
/ 14 сентября 2017

Единственный способ найти это - VIM или Notepad ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...