Bagaimana saya bisa melihat pengkodean mana yang digunakan dalam file

23

Saya punya beberapa masalah dengan file subtitle dalam video omxplayer. Untuk mengatasinya saya harus mengkonversi dari Windows-1250 ke UTF-8 encoding. Pertanyaan saya adalah, bagaimana saya bisa melihat file tertentu yang menggunakan pengkodean?

Model NonStandard
sumber
piconvuntuk mengubah pengkodean;)
Rinzwind
Iya nih. Saya telah mengubah penyandian (dalam 1 file). Tapi saya punya banyak dari ini dan ingin membuat skrip kecil yang akan mengendalikan semuanya dan kemudian terselubung jika diperlukan. Tapi saya kira saya bisa mengubah semuanya. Tidak ada salahnya akan dilakukan jika beberapa sudah di UTF-8. Kanan?
NonStandardModel
Tidak masalah tidak :) Gunakan saja wildcard
Rinzwind

Jawaban:

26

Anda tidak dapat benar-benar mengetahui secara otomatis apakah suatu file ditulis dengan penyandian X.

Apa yang dapat Anda lakukan dengan mudah adalah memverifikasi apakah file lengkap dapat berhasil diterjemahkan entah bagaimana (tetapi tidak harus dengan benar) menggunakan codec tertentu. Jika Anda menemukan byte yang tidak valid untuk pengkodean yang diberikan, itu pasti sesuatu yang lain.

Masalahnya adalah banyak codec yang serupa dan memiliki "pola byte yang valid" yang sama, hanya menafsirkannya sebagai karakter yang berbeda. Misalnya, äpengkodean dalam satu mungkin sesuai dengan yang élain atau ødalam yang ketiga. Komputer tidak dapat benar-benar mendeteksi cara menafsirkan hasil byte dalam teks yang dapat dibaca manusia dengan benar (kecuali jika Anda menambahkan kamus untuk semua jenis bahasa dan membiarkannya melakukan pemeriksaan ejaan ...). Anda juga harus tahu bahwa beberapa set karakter sebenarnya adalah himpunan bagian dari yang lain, seperti misalnya pengkodean ASCII adalah bagian dari codec yang paling umum digunakan seperti beberapa keluarga ANSI atau UTF-8. Itu berarti misalnya teks yang disimpan sebagai UTF-8 yang hanya berisi karakter latin sederhana, itu akan identik dengan file yang sama disimpan sebagai ASCII.


Namun, mari kita kembali dari menjelaskan apa yang tidak dapat Anda lakukan ke apa yang sebenarnya dapat Anda lakukan:

Untuk pemeriksaan dasar pada file teks ASCII / non-ASCII (biasanya UTF-8), Anda dapat menggunakan fileperintah. Itu tidak tahu banyak codec dan hanya memeriksa beberapa kB pertama file, dengan asumsi bahwa sisanya tidak akan mengandung karakter baru. Di sisi lain, ia juga mengenali tipe file umum lainnya seperti berbagai skrip, dokumen HTML / XML dan banyak format data biner (yang semuanya tidak menarik untuk membandingkan file teks) dan mungkin dapat mencetak informasi tambahan apakah ada garis yang sangat panjang atau apa. jenis urutan baris baru (misalnya UNIX: LF, Windows: CR + LF) digunakan.

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

Jika itu tidak cukup, saya dapat menawarkan kepada Anda skrip Python yang saya tulis untuk jawaban ini di sini , yang memindai file lengkap dan mencoba memecahkan kode menggunakan set karakter yang ditentukan. Jika berhasil, pengodean itu adalah kandidat potensial. Kalau tidak, jika ada byte yang tidak dapat diterjemahkan dengan itu, Anda dapat menghapus set karakter dari daftar Anda.

Komandan Byte
sumber
ANSI bukan nama pengkodean karakter apa pun. Mungkin Anda sedang memikirkan kode pelarian ANSI, yang dapat diekspresikan dengan pengkodean karakter ASCII.
kasperd
@kasperd Kemungkinan besar ia merujuk ke salah satu keluarga halaman kode ISO 8859 atau Window. Untuk pengembang windows Amerika Utara, pengkodean ANSI sering berarti pengkodean Windows 1252 untuk alasan historis.
user1937198
Ya, well, ANSI pada dasarnya adalah ASCII (kode 0-127) ditambah codepage khusus-lokal (kode 128-255). Jadi Anda benar ...
Komandan Byte
Info lebih lanjut: Apa itu format ANSI?
wjandrea
12

Sebuah program bernama filedapat melakukan ini. Contoh:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

Jika Anda tertarik untuk melakukannya, lihat src/encoding.c.

Arkadiusz Drabczyk
sumber
2
Itu bisa menebak .
hobbs
2
filemembuat tebakan, dan sering kali itu tidak terlalu bagus. Sebagai contoh, dalam pengujian saya, salah mengidentifikasi MacRoman dan CP-1252 sebagai ISO-8859, dengan hasil bahwa "š" dan "ß" diacak.
Markus
Hebat 👌! Menghabiskan beberapa jam untuk menemukan pengkodean yang benar dari .sqlfile lama saya dan filemenunjukkan kepada saya bahwa itu memang gzipfile terkompresi!
Amirreza Nasiri