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

206

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

TheWebGuy
источник
12
Угадайте кодировку файла в Windows , каков должен быть заголовок. Если вы не знаете заранее, вы никогда не сможете угадать наверняка.
Том Блоджет

Ответы:

222

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

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

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

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

MikeTeeVee
источник
1
@ Алекс, я не пользуюсь Win-8. Выполнив поиск в Google, я нашел эту ссылку: Блокнот Win-8 . Я надеюсь, что вы найдете это, потому что, уверяю вас, это все еще там.
MikeTeeVee
1
Спасибо, но в Windows 8.1 определенно нет приложения под названием блокнот. Когда вы вводите блокнот в поиске, появляется «редактор». И у этого нет этого выпадающего списка и нет меню для него
Алекс
4
Этот метод не работает для файлов, которые слишком велики для открытия Блокнота. И этот предел достигается гораздо быстрее, чем другие редакторы, такие как Notepad ++. Мой Windows 8.1 имеет Блокнот. Посмотрите в% windir% \ system32 \ notepad.exe возможно?
Фабиан Кесслер
3
Блокнот существует в Windows 8 и Windows 10.
Алан Б
6
Блокнот устанавливается во ВСЕ версии Windows, начиная с Windows 3, как минимум.
Жан-Франсуа Ларвуар
64

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

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

Если у вас установлен git, он находится в C: \ Program Files \ git \ usr \ bin.

Пример:

    C: \ Users \ SH \ Downloads \ SquareRoot> файл *
    _UpgradeReport_Files; каталог
    Отлаживать; каталог
    duration.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 (с спецификацией) с ограничителями строки CRLF
    SquareRoot.sln.docstates.suo; PCX вер. 2.5 данные изображения
    SquareRoot.suo; CDF V2 Document, поврежден: невозможно прочитать сводную информацию
    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> file - mime-encoding *
    _UpgradeReport_Files; двоичный
    Отлаживать; двоичный
    duration.h; US-ASCII
    ipch; двоичный
    main.cpp; US-ASCII
    Precision.txt; US-ASCII
    Релиз; двоичный
    Speed.txt; US-ASCII
    SquareRoot.sdf; двоичный
    SquareRoot.sln; UTF-8
    SquareRoot.sln.docstates.suo; двоичный
    SquareRoot.suo; CDF V2 Document, поврежден: невозможно прочитать сводную информацию
    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
Sybren
источник
1
обратите внимание, что вам, вероятно, нужен git 2.x для него, у меня его нет с git 1.9.5
jakub.g
Для моего файла это говорит "двоичный файл" :(
barbara.post
1
Невероятно, чтобы вернуться к командной строке для основной операции, это 2017, но похоже, что все в порядке.
Тодд Партридж
1
Как говорит другой ответ , вы можете также использовать fileкоманду в Cygwin . Любой набор инструментов POSIX для Windows должен иметь file.
Palswim
Если вы установили git для Windows, он включает в себя GIT BASH (эмулятор bash), который, в свою очередь, включает команду 'file'. Просто использовал это, и это работает. Это также упоминается в следующем ответе ...
Амир Кац
61

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

file *

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

Джордж Нинан
источник
добавив к вашему ответу, если вас интересует только конкретный файл, вы можете использовать команду grep для фильтрации результатов file *команды
ebram khalil
Вместо того, чтобы просто слепо запускать команду файла, полная команда, которая отвечает на этот вопрос, file --mime-encodingдолжна получить кодировку для файла
smac89
23

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

user961954
источник
4
Действительно полезно проанализировать несколько файлов
Эрик Бонно,
1
Мгновенный ответ даже с очень большими файлами (как и следовало ожидать).
Фабиан Кесслер
1
Работает на текущей Windows 10.
barbara.post
2
не могу понять, где находится исполняемый файл на этой странице. Ссылка устарела?
Кристоф
1
@MarkDeven Я добавил путь к exe в ответе
user961954
17

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

yzorg
источник
Get-FileEncodingкажется, не существует в моей системе. Это пользовательский командлет?
Ксавье Пуан
Есть много вариаций Get-FileEncodingна шикарный код. Я даже рассмотрел punycode из python и nodejs, но эта маленькая версия достигает 80/20 для моего использования (больше похоже на 99/1). Если вы размещаете файлы других людей, я предлагаю вам использовать fileкоманду из ответа Syben ( stackoverflow.com/a/34766140/195755 ) или другой декодер Unicode производственного качества.
yzorg
Следует добавить, что этот метод работает только при наличии спецификации ... что не всегда так
Yepeekai
@Yepeekai Последняя строка defaultкодируется (когда нет спецификации). Для XML, JSON и JavaScript по умолчанию используется UTF8, но пробег может отличаться.
Ёзорг
@yzorg: но это умственный способ сделать это. Вы просто лжете пользователю. По крайней мере, большинство парсеров делают обоснованное предположение. Если вы не можете угадать, просто скажите об ошибке и скажите, что для использования вашего кода требуется спецификация (а затем используйте другой, более умный инструмент, так как многие из них уже существуют).
Эд С.
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 *.

yzorg
источник
1
или вы можете просто использовать в fileкачестве псевдонима file.exe вместо file.exe¯ \ _ (ツ) _ / ¯
ferrell_io
@ferrell_io TL; DR: PS основан на .NET и .NET имеет статический класс File, и PS имеет достаточно заблуждение перегрузок с общей EXEs , которые я использую EXE - файл , чтобы отличить PS от Win EXE: dir | where Size -lt 10000против where.exe git.
yzorg
@ferrell_io Я использую, where.exeчтобы отличить его от wherePS, который является встроенным псевдонимом для Where-Object. Пример: where.exe git* vs ls . | where Size -lt 10000
yzorg
@ferrell_io Итак, я использую тот же шаблон для file.exeстатического класса .NET, который вам может понадобиться в том же сценарии, который обнаруживает кодировку. Пример: [File]::SetCreationTime("readme.md", [DateTime]::Now).
Ёзорг
6

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

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

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

введите описание изображения здесь

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

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

Просто тень
источник
4

Установите git (в Windows вы должны использовать консоль git bash). Тип:

file *   

для всех файлов в текущем каталоге, или

file */*   

для файлов во всех подкаталогах

phd_coder
источник
2

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

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

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

JaykeBird
источник
Хорошо, но когда я пытаюсь открыть файл с помощью Visual Studio, он всегда открывает файл в связанном текстовом редакторе (Notepad ++ для такого типа расширения файла).
barbara.post
@ barbara.post, я думаю, это будет связано с настройками Visual Studio. Я был в состоянии получить доступ к любым текстовым файлам любого типа в Visual Studio. Вы, вероятно, сказали ему просто переходить на Notepad ++ всякий раз, когда он встречает файл с таким расширением. Это мои мысли, по крайней мере.
JaykeBird
2

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

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

РЕДАКТИРОВАТЬ:

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

# 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
js2010
источник
1
@jeasoft Спасибо. Я добавил исправление для установки текущего каталога .net. stackoverflow.com/questions/11246068/…
js2010
1

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

Тодд Партридж
источник
2
К сожалению, они не «встроенные» инструменты
phuclv