Отримайте кодування файлу в 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.