Nhận mã hóa tệp trong Windows


206

Đây thực sự không phải là một câu hỏi lập trình, có một dòng lệnh hoặc công cụ Windows (Windows 7) để có được mã hóa hiện tại của một tệp văn bản không? Chắc chắn tôi có thể viết một ứng dụng C # nhỏ nhưng tôi muốn biết liệu đã có thứ gì đó được tích hợp chưa?


12
Đoán mã hóa một tập tin trong Windows là tiêu đề nên có. Nếu bạn không biết trước, bạn sẽ không bao giờ có thể đoán chắc chắn.
Tom Blodget

Câu trả lời:


222

Mở tệp của bạn bằng Notepad vanilla cũ thông thường đi kèm với Windows.
Nó sẽ hiển thị cho bạn mã hóa của tệp khi bạn nhấp vào " Lưu dưới dạng ... ".
Nó sẽ trông như thế này: nhập mô tả hình ảnh ở đây

Dù mã hóa được chọn mặc định là gì, đó là mã hóa hiện tại của bạn dành cho tệp.
Nếu là UTF-8, bạn có thể thay đổi nó thành ANSI và nhấp vào lưu để thay đổi mã hóa (hoặc visa-ngược lại).

Tôi nhận ra có nhiều loại mã hóa khác nhau, nhưng đây là tất cả những gì tôi cần khi tôi được thông báo các tệp xuất của chúng tôi ở dạng UTF-8 và chúng yêu cầu ANSI. Đó là xuất khẩu một lần, vì vậy Notepad phù hợp với hóa đơn cho tôi.

FYI: Theo hiểu biết của tôi, tôi nghĩ " Unicode " (như được liệt kê trong Notepad) là một cách gọi sai cho UTF-16.
Thêm ở đây trên tùy chọn " Unicode " của Notepad : Windows 7 - UTF-8 và Unicdoe


1
@Alex, tôi không sử dụng Win-8. Thực hiện tìm kiếm google, tôi tìm thấy liên kết này: Notepad Win-8 . Tôi hy vọng bạn tìm thấy nó bởi vì tôi đảm bảo với bạn, nó vẫn ở đó.
MikeTeeVee 20/07/2015

1
Cảm ơn nhưng trên Windows 8.1 chắc chắn không có ứng dụng nào gọi là notepad. Khi bạn nhập notepad vào tìm kiếm, "trình chỉnh sửa" sẽ xuất hiện. Và điều này cũng không có phần thả xuống mã hóa đó và cũng không có menu nào cho nó
Alex

4
Phương pháp này không hoạt động đối với các tệp quá lớn để Notepad mở. Và giới hạn đó đạt được nhanh hơn nhiều so với các trình soạn thảo khác như Notepad ++. Windows 8.1 của tôi không có Notepad. Tìm trong% Windir% \ system32 \ notepad.exe?
Fabian Kessler

3
Notepad tồn tại trong Windows 8 và Windows 10.
Alan B

6
Notepad được cài đặt trong TẤT CẢ các phiên bản Windows kể từ Windows 3.
Jean-François Larvoire

64

'Tệp' công cụ dòng lệnh (Linux) có sẵn trên Windows thông qua GnuWin32:

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

Nếu bạn đã cài đặt git, nó nằm trong C: \ Program Files \ git \ usr \ bin.

Thí dụ:

    C: \ Users \ SH \ Tải xuống \ SquareRoot> tệp *
    _UpTHERReport_Files; danh mục
    Gỡ lỗi; danh mục
    thời lượng.h; Văn bản chương trình ASCII C ++, với các đầu cuối dòng CRLF
    ipch; danh mục
    chính.cpp; Văn bản chương trình ASCII C, với các đầu cuối dòng CRLF
    Chính xác; Văn bản ASCII, với các đầu cuối dòng CRLF
    Giải phóng; danh mục
    Speed.txt; Văn bản ASCII, với các đầu cuối dòng CRLF
    SquareRoot.sdf; dữ liệu
    SquareRoot.sln; Văn bản Unicode UTF-8 (với BOM), với các đầu cuối dòng CRLF
    SquareRoot.sln.docstates.suo; PCX ver. Dữ liệu hình ảnh 2,5
    SquareRoot.suo; Tài liệu CDF V2, bị hỏng: Không thể đọc thông tin tóm tắt
    SquareRoot.vcproj; Văn bản tài liệu XML
    SquareRoot.vcxproj; Văn bản tài liệu XML
    SquareRoot.vcxproj.filters; Văn bản tài liệu XML
    SquareRoot.vcxproj.user; Văn bản tài liệu XML
    squarerootmethods.h; Văn bản chương trình ASCII C, với các đầu cuối dòng CRLF
    Nâng cấpLog.XML; Văn bản tài liệu XML

    C: \ Users \ SH \ Tải xuống \ SquareRoot> tệp - mã hóa thời gian *
    _UpTHERReport_Files; nhị phân
    Gỡ lỗi; nhị phân
    thời lượng.h; chúng tôi
    ipch; nhị phân
    chính.cpp; chúng tôi
    Chính xác; chúng tôi
    Giải phóng; nhị phân
    Speed.txt; chúng tôi
    SquareRoot.sdf; nhị phân
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; nhị phân
    SquareRoot.suo; Tài liệu CDF V2, bị hỏng: Không thể đọc tóm tắt infobinary
    SquareRoot.vcproj; chúng tôi
    SquareRoot.vcxproj; utf-8
    SquareRoot.vcxproj.filters; utf-8
    SquareRoot.vcxproj.user; utf-8
    squarerootmethods.h; chúng tôi
    Nâng cấpLog.XML; chúng tôi

1
lưu ý rằng bạn có thể cần git 2.x cho nó, tôi không có nó với git 1.9.5
jakub.g

Đối với tệp của tôi, nó ghi "nhị phân" :(
barbara.post

1
Không thể tin được là phải hoàn nguyên dòng lệnh cho hoạt động cơ bản, đây là năm 2017, nhưng có vẻ như sẽ ổn.
Todd Partridge

1
Giống như câu trả lời khác nói, bạn cũng có thể sử dụng filelệnh trong cygwin . Bất kỳ bộ công cụ POSIX cho Windows nên có file.
palswim

Nếu bạn đã cài đặt git cho windows, nó bao gồm GIT BASH (trình giả lập bash), lần lượt bao gồm lệnh 'file'. Chỉ cần sử dụng nó và nó hoạt động. Nó cũng được đề cập trong câu trả lời tiếp theo ...
Amir Katz

61

Nếu bạn có "git" hoặc "Cygwin" trên Windows Machine, thì hãy chuyển đến thư mục chứa tệp của bạn và thực hiện lệnh:

file *

Điều này sẽ cung cấp cho bạn các chi tiết mã hóa của tất cả các tệp trong thư mục đó.


Thêm vào câu trả lời của bạn, Nếu bạn chỉ quan tâm đến tệp cụ thể, bạn có thể sử dụng lệnh grep để lọc kết quả của file *lệnh
ebram khalil

Thay vì chỉ chạy lệnh tập tin một cách mù quáng, lệnh đầy đủ trả lời câu hỏi này là file --mime-encodinglấy mã hóa cho tập tin
smac89

23

Một công cụ khác mà tôi thấy hữu ích: https://archive.codeplex.com/?p=encodingchecker EXE có thể được tìm thấy ở đây


4
Thực sự hữu ích để phân tích nhiều tệp
Eric Bonnot

1
Trả lời ngay lập tức với các tệp rất lớn (như người ta mong đợi).
Fabian Kessler

1
Hoạt động trên Windows 10. hiện tại
barbara.post

2
không thể tìm ra tập tin exe ở đâu trên trang đó. Là liên kết lỗi thời?
Christoph

1
@MarkDeven Tôi đã thêm đường dẫn để trả lời
user961954

17

Dưới đây là cách tôi phát hiện họ mã hóa văn bản Unicode thông qua BOM. Độ chính xác của phương pháp này thấp, vì phương pháp này chỉ hoạt động trên các tệp văn bản (cụ thể là các tệp Unicode) và mặc định asciikhi không có BOM (như hầu hết các trình soạn thảo văn bản, mặc định sẽ là UTF8nếu bạn muốn khớp với hệ sinh thái HTTP / web ).

Cập nhật 2018 : Tôi không còn đề xuất phương pháp này nữa. Tôi khuyên bạn nên sử dụng file.exe từ các công cụ GIT hoặc * nix theo khuyến nghị của @Sybren và tôi chỉ cho bạn cách thực hiện điều đó qua PowerShell trong câu trả lời sau .

# 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

Khuyến nghị: Điều này có thể hoạt động khá tốt nếu dir, lshoặc Get-ChildItemchỉ kiểm tra được biết đến tập tin văn bản, và khi bạn chỉ tìm kiếm "mã hóa xấu" từ một danh sách được biết đến các công cụ. (tức là SQL Management Studio mặc định là UTF16, đã phá vỡ GIT auto-cr-lf cho Windows, vốn là mặc định trong nhiều năm.)


Get-FileEncodingdường như không tồn tại trên hệ thống của tôi. Nó có phải là một cmdlet tùy chỉnh?
Xavier Poinas

nhiều biến thể của Get-FileEncodingmã poshcode. Tôi thậm chí đã xem xét Punycode từ python và nodejs, nhưng phiên bản nhỏ này đạt 80/20 cho việc sử dụng của tôi (giống như 99/1). Nếu bạn đang lưu trữ tệp của người khác, tôi khuyên bạn nên sử dụng filelệnh từ câu trả lời của Syben ( stackoverflow.com/a/34766140/195755 ) hoặc một bộ giải mã unicode chất lượng sản xuất khác.
yzorg

Cần phải nói thêm rằng phương pháp này chỉ hoạt động nếu có BOM ... không phải lúc nào cũng vậy
Yepeekai

@Yepeekai Dòng cuối cùng là defaultmã hóa (khi không có BOM). Đối với XML, JSON và JavaScript, mặc định là UTF8, nhưng số dặm của bạn có thể thay đổi.
yzorg

@yzorg: nhưng đó là một cách chết não để làm điều đó. Bạn chỉ đang nói dối người dùng. Ít nhất là hầu hết các trình phân tích cú pháp đưa ra một phỏng đoán có giáo dục. Nếu bạn không thể đoán, chỉ cần đưa ra một lỗi và nói với họ rằng BOM được yêu cầu sử dụng mã của bạn (và sau đó sử dụng một công cụ khác thông minh hơn như nhiều công cụ đã tồn tại).
Ed S.

7

Tôi đã viết câu trả lời số 4 (tại thời điểm viết). Nhưng gần đây tôi đã cài đặt git trên tất cả các máy tính của mình, vì vậy bây giờ tôi sử dụng giải pháp của @ Sybren. Đây là một câu trả lời mới giúp giải pháp đó trở nên hữu ích từ powershell (không đưa tất cả git / usr / bin vào PATH, quá nhiều lộn xộn đối với tôi).

Thêm phần này vào profile.ps1:

$global:gitbin = 'C:\Program Files\Git\usr\bin'
Set-Alias file.exe $gitbin\file.exe

Và được sử dụng như : file.exe --mime-encoding *. Bạn phải bao gồm .exe trong lệnh để bí danh PS hoạt động.

Nhưng nếu bạn không tùy chỉnh PowerShell bạn profile.ps1 Tôi đề nghị bạn bắt đầu với tôi: https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 và tiết kiệm nó ~\Documents\WindowsPowerShell. Sử dụng an toàn trên máy tính không có git, nhưng sẽ viết cảnh báo khi không tìm thấy git.

Các .exe trong lệnh cũng là cách tôi sử dụng C:\WINDOWS\system32\where.exetừ PowerShell; và nhiều lệnh OS CLI khác được "ẩn theo mặc định" bởi powershell, * nhún *.


1
hoặc bạn chỉ có thể sử dụng filelàm bí danh của mình cho file.exe thay vì file.exe¯ \ _ () _ / ¯
ferrell_io

@ferrell_io TL; DR: PS được dựa trên .NET và .NET có lớp tĩnh File, và PS có đủ quá tải gây nhầm lẫn với EXEs phổ biến mà tôi sử dụng .exe để phân biệt PS từ Win EXE: dir | where Size -lt 10000vs where.exe git.
yzorg

@ferrell_io Tôi sử dụng where.exeđể phân biệt với wherePS, đây là một bí danh tích hợp cho Where-Object. Ví dụ: where.exe git* vs ls . | where Size -lt 10000
yzorg

@ferrell_io Vì vậy, tôi sử dụng cùng một mẫu cho file.exelớp tĩnh .NET, mà bạn có thể cần trong cùng một tập lệnh đang phát hiện mã hóa. Ví dụ : [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg

6

Một giải pháp đơn giản có thể là mở tệp trong Firefox.

  1. Kéo và thả tệp vào firefox
  2. Nhấp chuột phải vào trang
  3. Chọn "Xem thông tin trang"

và mã hóa văn bản sẽ xuất hiện trên cửa sổ "Thông tin trang".

nhập mô tả hình ảnh ở đây

Lưu ý: Nếu tệp không ở định dạng txt, chỉ cần đổi tên thành txt và thử lại.

PS Để biết thêm thông thấy này bài viết.


4

Cài đặt git (trên Windows bạn phải sử dụng bảng điều khiển git bash). Kiểu:

file *   

cho tất cả các tệp trong thư mục hiện tại, hoặc

file */*   

cho các tệp trong tất cả các thư mục con



2

Tương tự như giải pháp được liệt kê ở trên với Notepad, bạn cũng có thể mở tệp trong Visual Studio, nếu bạn đang sử dụng. Trong Visual Studio, bạn có thể chọn "Tệp> Tùy chọn lưu nâng cao ..."

Hộp tổ hợp "Mã hóa:" sẽ cho bạn biết cụ thể mã hóa nào hiện đang được sử dụng cho tệp. Nó có nhiều mã hóa văn bản được liệt kê trong đó hơn Notepad, vì vậy nó hữu ích khi xử lý các tệp khác nhau từ khắp nơi trên thế giới và bất cứ thứ gì khác.

Giống như Notepad, bạn cũng có thể thay đổi mã hóa từ danh sách các tùy chọn ở đó, sau đó lưu tệp sau khi nhấn "OK". Bạn cũng có thể chọn mã hóa bạn muốn thông qua tùy chọn "Lưu bằng mã hóa ..." trong hộp thoại Lưu dưới dạng (bằng cách nhấp vào mũi tên bên cạnh nút Lưu).


Đẹp nhưng khi tôi cố mở tệp bằng Visual Studio, nó luôn mở tệp trong trình soạn thảo văn bản liên quan (Notepad ++ cho loại phần mở rộng tệp này).
barbara.post

@ barbara.post đó sẽ là một cái gì đó để làm với các cài đặt Visual Studio của bạn, tôi nghĩ vậy. Tôi đã có thể truy cập bất kỳ tệp văn bản đơn giản thuộc bất kỳ loại nào trong Visual Studio. Có lẽ bạn đã bảo nó chỉ vào Notepad ++ bất cứ khi nào nó gặp một tệp có phần mở rộng đó. Đó là suy nghĩ của tôi, ít nhất.
JaykeBird

2

Một số mã C ở đây để phát hiện ascii đáng tin cậy, bom và utf8: https://unicodebook.readthedocs.io/guess_encoding.html

Chỉ ASCII, UTF-8 và mã hóa bằng BOM (UTF-7 với BOM, UTF-8 với BOM, UTF-16 và UTF-32) có thuật toán đáng tin cậy để mã hóa tài liệu. Đối với tất cả các mã hóa khác, bạn phải tin tưởng heuristic dựa trên số liệu thống kê.

BIÊN TẬP:

Phiên bản quyền hạn của câu trả lời C # từ: Cách hiệu quả để tìm Mã hóa của bất kỳ tệp nào . Chỉ hoạt động với chữ ký (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 Cảm ơn. Tôi đã thêm vào một bản sửa lỗi để thiết lập thư mục hiện tại .net. stackoverflow.com/questions/11246068/
hy

1

Cách duy nhất mà tôi đã tìm thấy để làm điều này là VIM hoặc Notepad ++.


2
Thật không may, chúng không phải là các công cụ "dựng sẵn"
phuclv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.