Получить кодировку файла в Windows

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

Ответы

Ответ 1

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

Независимо от выбранной по умолчанию кодировки, это то, что ваша текущая кодировка для файла.

Если это UTF-8, вы можете изменить его на ANSI и нажать "Сохранить", чтобы изменить кодировку (или наоборот).

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

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

Ответ 2

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

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

Ответ 3

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

file *

Это даст вам информацию о кодировке всех файлов в этой папке.

Ответ 5

Здесь я расскажу, как определить семейство текстовых кодировок 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, который был по умолчанию в течение многих лет.)

Ответ 6

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

Ответ 8

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

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

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

Ответ 9

Вот некоторый 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 ответа С# от: Эффективный способ найти любую кодировку файла. Работает только с подписями (бомбами).

# get-encoding.ps1
param([Parameter(ValueFromPipeline=$True)] $filename)    
begin {
  # set .net current directory                                                                                                   
  [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

Ответ 10

Простым решением может быть открытие файла в Firefox.

  1. Перетащите файл в Firefox
  2. Щелкните правой кнопкой мыши на странице
  3. Выберите "Просмотр информации о странице"

и кодировка текста появится в окне "Информация о странице".

enter image description here

Примечание. Если файл не в формате txt, просто переименуйте его в txt и повторите попытку.

Постскриптум Для получения дополнительной информации см. эту статью.

Ответ 11

Единственным способом, который я нашел для этого, является VIM или Notepad ++.