Це насправді не питання програмування, чи є командний рядок чи інструмент Windows (Windows 7) для отримання поточного кодування текстового файлу? Звичайно, я можу написати невеликий додаток C #, але я хотів знати, чи є щось вже вбудоване?
Це насправді не питання програмування, чи є командний рядок чи інструмент Windows (Windows 7) для отримання поточного кодування текстового файлу? Звичайно, я можу написати невеликий додаток C #, але я хотів знати, чи є щось вже вбудоване?
Відповіді:
Відкрийте свій файл за допомогою звичайного старого блокноту ванілі, який постачається разом із Windows.
Він покаже вам кодування файлу, натиснувши " Зберегти як ... ".
Це буде виглядати приблизно так:
Незалежно від обраного за замовчуванням кодування, саме таким є ваше поточне кодування для файлу.
Якщо це UTF-8, ви можете змінити його на ANSI і натисніть кнопку "Зберегти", щоб змінити кодування (або візу).
Я розумію, що існує багато різних типів кодування, але це було все, що мені було потрібно, коли мені повідомили, що наші експортні файли були в UTF-8, і їм потрібен ANSI. Це був одноразовий експорт, тому Блокнот підходив до мене.
FYI: Наскільки я розумію, я вважаю, що " Unicode " (як зазначено в Блокноті) є неправильним для UTF-16.
Детальніше тут про опцію " Unicode " блокнота : Windows 7 - UTF-8 та Unicdoe
Інструмент командного рядка (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
file
команду в cygwin . Будь-який набір інструментів POSIX для Windows повинен мати file
.
Якщо у вас на машині Windows "git" або "Cygwin", перейдіть до папки, у якій присутній ваш файл, і виконайте команду:
file *
Це дасть вам інформацію про кодування всіх файлів у цій папці.
file *
команди
file --mime-encoding
отримати кодування для файлу
Ще один інструмент, який мені здався корисним: https://archive.codeplex.com/?p=encodingchecker EXE можна знайти тут
Ось мій погляд, як визначити сімейство текстових кодувань 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
начебто не існує в моїй системі. Це користувацький командлет?
Get-FileEncoding
поштового коду. Я навіть переглядав punycode з python та nodejs, але ця невелика версія досягає 80/20 для мого використання (більше схоже на 99/1). Якщо ви розміщуєте файли інших людей, я пропоную вам використовувати file
команду від відповіді Syben в ( stackoverflow.com/a/34766140/195755 ) або іншого виробництво якісного юнікода декодера.
default
кодує (коли немає BOM). Для XML, JSON та JavaScript типовим є UTF8, але пробіг може змінюватися.
Я написав відповідь №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, * знизують плечима *
file
як псевдонім file.exe замість file.exe
¯ \ _ (ツ) _ / ¯
dir | where Size -lt 10000
проти where.exe git
.
where.exe
для відмежування від where
PS, який є вбудованим псевдонімом для Where-Object
. Приклад: where.exe git*
vs ls . | where Size -lt 10000
file.exe
статичного класу vs .NET, який вам може знадобитися в тому ж сценарії, що виявляє кодування. Приклад: [File]::SetCreationTime("readme.md", [DateTime]::Now)
.
Простим рішенням може бути відкриття файлу у Firefox.
і кодування тексту з’явиться у вікні «Інформація про сторінку».
Примітка: Якщо файл не у форматі txt, просто перейменуйте його в txt і повторіть спробу.
PS Для отримання додаткової інформації дивіться цю статтю.
Ви можете використовувати безкоштовну утиліту під назвою Encoding Recognizer (вимагає Java). Ви можете знайти його на веб- сайті http://mindprod.com/products2.html#ENCODINGRECOGNISER
Подібно до рішення, перерахованого вище у «Блокноті», ви також можете відкрити файл у Visual Studio, якщо ви його використовуєте. У Visual Studio ви можете вибрати "Файл> Додаткові параметри збереження ..."
Комбіноване поле "Кодування:" підкаже вам, яке кодування використовується для цього файлу. У ньому перераховано набагато більше текстових кодувань, ніж у Блокноті, тому це корисно при роботі з різними файлами з усього світу та будь-яким іншим.
Так само, як і Блокнот, ви також можете змінити кодування зі списку параметрів, а потім зберегти файл після натискання кнопки "ОК". Ви також можете вибрати потрібне кодування за допомогою параметра "Зберегти за допомогою кодування ..." у діалоговому вікні "Зберегти як" (натиснувши стрілку біля кнопки "Зберегти").
Тут наведено код 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
Єдиний спосіб, який я знайшов це зробити, це VIM або Notepad ++.