Отримайте кодування файлу в Windows


206

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


12
Вгадайте, кодування файлу в Windows - те, якою має бути назва. Якщо ви не знаєте заздалегідь, ви ніколи не зможете здогадатися напевно.
Том Блоджет

Відповіді:


222

Відкрийте свій файл за допомогою звичайного старого блокноту ванілі, який постачається разом із Windows.
Він покаже вам кодування файлу, натиснувши " Зберегти як ... ".
Це буде виглядати приблизно так: введіть тут опис зображення

Незалежно від обраного за замовчуванням кодування, саме таким є ваше поточне кодування для файлу.
Якщо це UTF-8, ви можете змінити його на ANSI і натисніть кнопку "Зберегти", щоб змінити кодування (або візу).

Я розумію, що існує багато різних типів кодування, але це було все, що мені було потрібно, коли мені повідомили, що наші експортні файли були в UTF-8, і їм потрібен ANSI. Це був одноразовий експорт, тому Блокнот підходив до мене.

FYI: Наскільки я розумію, я вважаю, що " Unicode " (як зазначено в Блокноті) є неправильним для UTF-16.
Детальніше тут про опцію " Unicode " блокнота : Windows 7 - UTF-8 та Unicdoe


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: \ Користувачі \ SH \ Завантаження \ 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: \ Користувачі \ SH \ Завантаження \ SquareRoot> файл - кодування часу *
    _UpgradeReport_Files; двійкові
    Налагоджувати; двійкові
    тривалість.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, пошкоджений: Неможливо прочитати короткометражну інформацію
    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

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 можна знайти тут


4
Дуже корисно проаналізувати кілька файлів
Ерік Боннот

1
Миттєва відповідь навіть із дуже великими файлами (як можна було б очікувати).
Фабіан Кесслер

1
Працює на поточній Windows 10.
barbara.post

2
не можу зрозуміти, де знаходиться файл exe на цій сторінці. Чи посилання застаріло?
Крістоф

1
@MarkDeven У відповідь я додав шлях до exe
user961954

17

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

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


Get-FileEncodingначебто не існує в моїй системі. Це користувацький командлет?
Xavier Poinas

Існує багато варіантів роботи Get-FileEncodingпоштового коду. Я навіть переглядав punycode з python та nodejs, але ця невелика версія досягає 80/20 для мого використання (більше схоже на 99/1). Якщо ви розміщуєте файли інших людей, я пропоную вам використовувати fileкоманду від відповіді Syben в ( stackoverflow.com/a/34766140/195755 ) або іншого виробництво якісного юнікода декодера.
yzorg

Слід додати, що цей метод працює лише за наявності БОМ ... що не завжди так
Yepeekai

@Yepeekai Останній рядок defaultкодує (коли немає BOM). Для XML, JSON та JavaScript типовим є UTF8, але пробіг може змінюватися.
yzorg

@yzorg: але це мозковий мертвий спосіб зробити це. Ти просто брешеш користувачеві. Принаймні більшість парсерів роблять освіту здогадкою. Якщо ви не можете здогадатися, просто киньте помилку і скажіть їм, що BOM повинен використовувати ваш код (а потім перейдіть до використання іншого, розумнішого інструменту, оскільки їх уже існує).
Ед С.

7

Я написав відповідь №4 (під час написання). Але останнім часом у мене встановлено git на всіх моїх комп’ютерах, тому зараз я використовую рішення @ Sybren. Ось нова відповідь, яка робить це рішення корисним з shellhell (не ставлячи всі 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 в команді також , як я використовую C:\WINDOWS\system32\where.exeз PowerShell; та багато інших команд ОС CLI, які "приховано за замовчуванням" від powerhell, * знизують плечима *


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статичного класу vs .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 ви можете вибрати "Файл> Додаткові параметри збереження ..."

Комбіноване поле "Кодування:" підкаже вам, яке кодування використовується для цього файлу. У ньому перераховано набагато більше текстових кодувань, ніж у Блокноті, тому це корисно при роботі з різними файлами з усього світу та будь-яким іншим.

Так само, як і Блокнот, ви також можете змінити кодування зі списку параметрів, а потім зберегти файл після натискання кнопки "ОК". Ви також можете вибрати потрібне кодування за допомогою параметра "Зберегти за допомогою кодування ..." у діалоговому вікні "Зберегти як" (натиснувши стрілку біля кнопки "Зберегти").


Приємно, але коли я намагаюся відкрити файл за допомогою Visual Studio, він завжди відкриває файл у відповідному текстовому редакторі (Notepad ++ для такого типу розширення файлу).
barbara.post

@ barbara.post, я б подумав, що це може стосуватися ваших налаштувань Visual Studio. Мені вдалося отримати доступ до будь-яких простих текстових файлів будь-якого типу у Visual Studio. Ви, напевно, сказали йому просто перейти до «Блокнот ++» кожного разу, коли він стикається з файлом із цим розширенням. Принаймні, це мої думки.
JaykeBird

2

Тут наведено код 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 # від: Ефективний спосіб знайти кодування будь-якого файлу . Працює лише з підписами (boms).

# 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.