Dalam aplikasi kami, kami menerima file teks ( .txt
, .csv
, dll) dari berbagai sumber. Saat membaca, file-file ini kadang-kadang mengandung sampah, karena file mana yang dibuat dalam codepage berbeda / tidak dikenal.
Apakah ada cara untuk (secara otomatis) mendeteksi codepage dari file teks?
The detectEncodingFromByteOrderMarks
, pada StreamReader
konstruktor, bekerja untuk UTF8
dan unicode ditandai file lainnya, tapi saya sedang mencari cara untuk mendeteksi halaman kode, seperti ibm850
, windows1252
.
Terima kasih atas jawaban Anda, inilah yang saya lakukan.
File yang kami terima adalah dari pengguna akhir, mereka tidak memiliki petunjuk tentang codepage. Penerima juga merupakan pengguna akhir, sekarang ini yang mereka ketahui tentang codepage: Codepage ada, dan menjengkelkan.
Larutan:
- Buka file yang diterima di Notepad, lihat sepotong teks yang kacau. Jika seseorang disebut François atau sesuatu, dengan kecerdasan manusia Anda, Anda dapat menebaknya.
- Saya telah membuat aplikasi kecil yang dapat digunakan pengguna untuk membuka file, dan memasukkan teks yang pengguna tahu akan muncul di file, ketika codepage yang benar digunakan.
- Ulangi semua kode halaman, dan tampilkan yang memberikan solusi dengan teks yang disediakan pengguna.
- Jika lebih dari satu codepage muncul, minta pengguna untuk menentukan lebih banyak teks.
Jika Anda mencari untuk mendeteksi pengkodean non-UTF (yaitu tidak ada BOM), Anda pada dasarnya ke heuristik dan analisis statistik teks. Anda mungkin ingin melihat kertas Mozilla pada deteksi charset universal ( tautan yang sama, dengan pemformatan yang lebih baik melalui Wayback Machine ).
sumber
Sudahkah Anda mencoba port C # untuk Mozilla Universal Charset Detector
Contoh dari http://code.google.com/p/ude/
sumber
private Encoding GetEncodingFromString(string encoding) { try { return Encoding.GetEncoding(encoding); } catch { return Encoding.ASCII; } }
Ini jelas salah. Setiap browser web memiliki semacam detektor charset universal untuk menangani halaman yang tidak memiliki indikasi penyandian apa pun. Firefox punya satu. Anda dapat mengunduh kode dan melihat bagaimana melakukannya. Lihat beberapa dokumentasi di sini . Pada dasarnya, ini heuristik, tetapi yang bekerja sangat baik.
Mengingat jumlah teks yang masuk akal, bahkan dimungkinkan untuk mendeteksi bahasa.
Ini satu lagi yang baru saja saya temukan menggunakan Google:
sumber
a character encoding declaration is required even if the encoding is US-ASCII
- deklarasi yang kurang menghasilkan penggunaan algoritma heuristik, tidak jatuh kembali ke UTF8.Saya tahu ini sudah sangat terlambat untuk pertanyaan ini dan solusi ini tidak akan menarik bagi beberapa orang (karena bias bahasa Inggris-sentris dan kurangnya statistik / pengujian empiris), tetapi ini bekerja sangat baik untuk saya, terutama untuk memproses data CSV yang diunggah:
http://www.architectshack.com/TextFileEncodingDetector.ashx
Keuntungan:
Catatan: Akulah yang menulis kelas ini, jadi jelas bawa dengan sebutir garam! :)
sumber
Notepad ++ memiliki fitur ini di luar kotak. Ini juga mendukung mengubahnya.
sumber
Mencari solusi yang berbeda, saya menemukan itu
https://code.google.com/p/ude/
solusi ini agak berat.
Saya memerlukan beberapa deteksi dasar pengkodean, berdasarkan 4 byte pertama dan mungkin deteksi charset xml - jadi saya telah mengambil beberapa kode sumber sampel dari internet dan menambahkan versi modifikasi dari
http://lists.w3.org/Archives/Public/www-validator/2002Aug/0084.html
ditulis untuk Java.
Cukup membaca mungkin 1024 byte pertama dari file, tapi saya memuat seluruh file.
sumber
Jika seseorang mencari solusi 93,9%. Ini bekerja untuk saya:
sumber
Saya telah melakukan sesuatu yang serupa dengan Python. Pada dasarnya, Anda memerlukan banyak data sampel dari berbagai pengkodean, yang dipecah oleh jendela dua byte geser dan disimpan dalam kamus (hash), dikunci pada byte-pasangan yang memberikan nilai daftar pengkodean.
Dengan kamus (hash) itu, Anda mengambil teks input dan:
Jika Anda juga mengambil sampel teks berkode UTF yang tidak dimulai dengan BOM apa pun, langkah kedua akan mencakup teks-teks yang tergelincir dari langkah pertama.
Sejauh ini, ini berfungsi untuk saya (data sampel dan data input berikutnya adalah subtitle dalam berbagai bahasa) dengan tingkat kesalahan yang semakin berkurang.
sumber
Alat "uchardet" melakukan ini dengan baik menggunakan model distribusi frekuensi karakter untuk setiap rangkaian karakter. File yang lebih besar dan lebih banyak "tipikal" file memiliki lebih banyak kepercayaan diri (jelas).
Di ubuntu, Anda baru saja
apt-get install uchardet
.Di sistem lain, dapatkan sumber, penggunaan & dokumen di sini: https://github.com/BYVoid/uchardet
sumber
brew install uchardet
Konstruktor kelas StreamReader mengambil parameter 'deteksi penyandian'.
sumber
Jika Anda bisa menautkan ke pustaka C, Anda bisa menggunakan
libenca
. Lihat http://cihar.com/software/enca/ . Dari halaman manual:Ini GPL v2.
sumber
Mendapat masalah yang sama tetapi belum menemukan solusi yang baik untuk mendeteksinya secara otomatis. Sekarang saya menggunakan PsPad (www.pspad.com) untuk itu;) berfungsi dengan baik
sumber
Karena pada dasarnya turun ke heuristik, mungkin membantu menggunakan pengkodean file yang diterima sebelumnya dari sumber yang sama sebagai petunjuk pertama.
Kebanyakan orang (atau aplikasi) melakukan hal-hal dalam urutan yang hampir sama setiap kali, sering pada mesin yang sama, sehingga sangat mungkin bahwa ketika Bob membuat file .csv dan mengirimkannya ke Mary, ia akan selalu menggunakan Windows-1252 atau apa pun default mesinnya.
Jika memungkinkan, sedikit pelatihan pelanggan tidak akan menyakitkan :-)
sumber
Saya sebenarnya mencari cara pemrograman generik, bukan untuk mendeteksi penyandian file, tetapi saya belum menemukannya. Apa yang saya temukan dengan pengujian dengan pengkodean yang berbeda adalah bahwa teks saya adalah UTF-7.
Jadi di mana saya pertama kali lakukan: StreamReader file = File.OpenText (fullfilename);
Saya harus mengubahnya ke: StreamReader file = new StreamReader (fullfilename, System.Text.Encoding.UTF7);
OpenText menganggap itu UTF-8.
Anda juga dapat membuat StreamReader seperti StreamReader baru ini (fullfilename, true), parameter kedua yang berarti harus mencoba dan mendeteksi pengkodean dari byteordermark file, tetapi itu tidak berfungsi dalam kasus saya.
sumber
Buka file di AkelPad (atau cukup salin / tempel teks yang kacau), buka Edit -> Selection -> Recode ... -> centang "Autodetect".
sumber
Sebagai tambahan pada posting ITmeze, saya telah menggunakan fungsi ini untuk mengubah output port C # untuk Mozilla Universal Charset Detector
MSDN
sumber
Terima kasih @ Erik Aronesty untuk menyebut
uchardet
.Sementara itu alat (? Sama) ada untuk linux:
chardet
.Atau, di cygwin Anda mungkin ingin menggunakan:
chardetect
.Lihat: halaman manual chardet: https://www.commandlinux.com/man-page/man1/chardetect.1.html
Ini akan secara heuristik mendeteksi (menebak) pengkodean karakter untuk setiap file yang diberikan dan akan melaporkan nama dan tingkat kepercayaan untuk setiap pengkodean karakter yang terdeteksi dari setiap file.
sumber
Saya menggunakan kode ini untuk mendeteksi Unicode dan windows default ansi codepage ketika membaca file. Untuk pengkodean lain, pemeriksaan konten diperlukan, secara manual atau dengan pemrograman. Ini dapat digunakan untuk menyimpan teks dengan pengkodean yang sama seperti ketika dibuka. (Saya menggunakan VB.NET)
sumber
10Y (!) Telah berlalu sejak ini ditanyakan, dan saya masih melihat tidak menyebutkan solusi MS yang baik dan non-GPL: IMultiLanguage2 API.
Sebagian besar perpustakaan yang disebutkan berdasarkan pada UDE Mozilla - dan tampaknya masuk akal bahwa browser telah mengatasi masalah yang sama. Saya tidak tahu apa solusi chrome, tetapi karena IE 5.0 MS telah merilis solusi mereka, dan itu adalah:
Ini adalah panggilan COM asli, tapi di sini ada beberapa karya yang sangat bagus dari Carsten Zeumer, yang menangani kekacauan interop untuk penggunaan .net. Ada beberapa yang lain di sekitar, tetapi pada umumnya perpustakaan ini tidak mendapatkan perhatian yang layak.
sumber