কীভাবে পাঠ্য ফাইল এনকোডিং সনাক্ত করতে পারে?


69

অনেকগুলি সরল পাঠ্য ফাইল রয়েছে যা বৈকল্পিক অক্ষরে এনকোডড ছিল।

আমি তাদের সকলকে ইউটিএফ -8 এ রূপান্তর করতে চাই, তবে আইকনভি চালানোর আগে, এর মূল এনকোডিংটি আমার জানা উচিত। বেশিরভাগ ব্রাউজারের Auto Detectএনকোডিংগুলিতে একটি বিকল্প থাকে তবে আমি সেই পাঠ্য ফাইলগুলি একের পর এক চেক করতে পারি না কারণ অনেক বেশি।

কেবলমাত্র মূল এনকোডিংটি জানা থাকার পরে আমি পাঠ্যগুলি দ্বারা রূপান্তর করতে পারি iconv -f DETECTED_CHARSET -t utf-8

প্লেইন টেক্সট ফাইলগুলির এনকোডিং সনাক্ত করার জন্য কি কোনও ইউটিলিটি রয়েছে? এটি ১০০% নিখুঁত হতে হবে না, যদি ১০,০০,০০০ ফাইলে ১০০ টি ফাইল ভুল রূপান্তরিত হয় তবে আমার আপত্তি নেই।

উত্তর:


57

ব্যবহার করে দেখুন chardet পাইথন মডিউল দেখবেন, যার PyPi পাওয়া যায়:

pip install chardet

তারপরে দৌড়াও chardetect myfile.txt

চারডেট মোজিলা দ্বারা ব্যবহৃত সনাক্তকরণ কোডের উপর ভিত্তি করে তৈরি করা হয়েছে , সুতরাং এটি স্ট্র্যাটিজিকাল বিশ্লেষণের জন্য ইনপুট পাঠ্য দীর্ঘ দীর্ঘায়িত করে তবে যুক্তিসঙ্গত ফলাফল দেওয়া উচিত। পড়া না প্রজেক্ট ডকুমেন্টেশন

মন্তব্যে উল্লিখিত হিসাবে এটি বেশ ধীর, তবে কিছু বিতরণ https://superuser.com/a/609056 তে যেমন পাওয়া গেছে সে হিসাবে @ জাভিয়ারের হিসাবে মূল সি ++ সংস্করণও প্রেরণ করা হয়েছে । কোথাও একটি জাভা সংস্করণ রয়েছে।


3
হ্যাঁ, এবং এটি ইতিমধ্যে python-chardetউবুন্টু মহাবিশ্বের রেপোর মতো প্যাকেজড ।
Xiè Jìléi

যদি এটি একটি নিখুঁত অনুমান না হয় chardetতবে এখনও সবচেয়ে সঠিকভাবে অনুমান দেবে, পছন্দ করুন ./a.txt: GB2312 (confidence: 0.99)। এনকা এর সাথে তুলনা করুন যা সবেমাত্র ব্যর্থ হয়েছে এবং 'অচেনা এনকোডিং'-এর প্রতিবেদন করে। তবে দুঃখজনকভাবে যথেষ্ট, chardetখুব ধীর গতিতে চলে।
Xiè Jìléi

1
@ 谢 继 雷: এটি রাতারাতি চালিয়ে যান বা এরকম কিছু। Charset সনাক্তকরণ হয় একটি জটিল প্রক্রিয়া । এছাড়াও আপনি জাভা ভিত্তিক jChardet বা চেষ্টা করে দেখতে পারেন ... মূল chardet হয় মোজিলা অংশ , কিন্তু শুধুমাত্র সি ++ উৎস পাওয়া যায়, কোন কম্যান্ড-লাইন টুল।
মাধ্যাকর্ষণ

2
গতি সম্পর্কে: chardet <(head -c4000 filename.txt)আমার ব্যবহারের ক্ষেত্রে দৌড়াদৌড়ি অনেক দ্রুত এবং সমানভাবে সফল ছিল। (যদি এটি পরিষ্কার না হয় তবে এই বাশ সিনট্যাক্সটি প্রথম প্রথম 4000 বাইট চারডেটে প্রেরণ করবে)
nddou

@ndemou আমি chardet==3.0.4, এবং কমান্ড লাইন টুল প্রকৃত এক্সিকিউটেবল নাম chardetectনা chardet
ডেভি

31

আমি এই সহজ কমান্ডটি ব্যবহার করব:

encoding=$(file -bi myfile.txt)

অথবা আপনি যদি চান তবে আসল চরিত্রের সেটটি (যেমন utf-8):

encoding=$(file -b --mime-encoding myfile.txt)

4
দুর্ভাগ্যক্রমে, fileকেবলমাত্র ইউটিএফ -8 বা ইউটিএফ -16 এর মতো নির্দিষ্ট বৈশিষ্ট্যযুক্ত এনকোডিংগুলি সনাক্ত করে। বাকী - পুরানো আইএসও 8859 বা তাদের এমএস-ডস এবং উইন্ডোজ সংবাদদাতাদের - "অজানা -8 বিট" বা অনুরূপ কিছু হিসাবে তালিকাভুক্ত করা হয়েছে এমনকি এমন ফাইলগুলির জন্য যা chardet99% আত্মবিশ্বাসের সাথে সনাক্ত করে।
মাধ্যাকর্ষণ

6
ফাইলটি আমাকে আইসো
-8859-1

এক্সটেনশন মিথ্যা বললে কী হয়?
james.garriss

2
@ james.garriss: ফাইল এক্সটেনশনের এর (পাঠ্য) সামগ্রী এনকোডিংয়ের সাথে কোনও সম্পর্ক নেই।
MestreLion

29

ডেবিয়ান-ভিত্তিক লিনাক্সে, উচার্ডেট প্যাকেজ ( ডেবিয়ান / উবুন্টু ) একটি কমান্ড লাইন সরঞ্জাম সরবরাহ করে। প্যাকেজ বিবরণ নীচে দেখুন:

 universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html

3
ধন্যবাদ! প্রকল্পের হোমপেজ থেকে আমার কাছে স্পষ্ট ছিল না যে এর মধ্যে একটি সিএলআই অন্তর্ভুক্ত ছিল। uchardetহোমব্রিউয়ের মাধ্যমে ইনস্টল করার সময় এটি ওএস এক্সেও উপলব্ধ।
স্টিফান শ্মিড্ট

1
আমি প্রথমে কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম কারণ একটি আইএসও 8859-1 নথিটি ভুলভাবে উইন্ডোজ -1222 হিসাবে চিহ্নিত হয়েছিল তবে মুদ্রণযোগ্য পরিসরে উইন্ডোজ -1222 আইএসও 8859-1 এর একটি সুপারসেট তাই iconvসূক্ষ্মভাবে কাজ করে রূপান্তর ।
স্টিফান শ্মিট

16

লিনাক্সের জন্য, সেখানে এনকা এবং সোলারিসের জন্য আপনি অটো_ফ ব্যবহার করতে পারেন ।


এনকা আমার পক্ষে খুব কঠোর বলে মনে হচ্ছে: enca -d -L zh ./a.txtবার্তাটি দিয়ে ব্যর্থ হয়েছে ./a.txt: Unrecognized encoding Failure reason: No clear winner.@ গ্রায়েটি উল্লিখিত হিসাবে, chardetএটি আরও শিথিল, তবে এটি এখনও খুব ধীর।
Xiè Jìléi

10
এনকা পুরোপুরি "আসলে কিছু করে" পরীক্ষায় ব্যর্থ হয়।
মাইকেল উলফ

1
uchardet ব্যর্থ হয়েছে (আসল সিপি 1250 এর পরিবর্তে সিপি 1252 সনাক্ত হয়েছে), তবে এনকা ঠিকঠাক কাজ করেছে। (একক উদাহরণ, সাধারণীকরণ করা শক্ত ...)
পালো


2

চারডেটে ফিরে পাওয়া (পাইথন ২??) এই কলটি যথেষ্ট হতে পারে:

python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

যদিও এটি নিখুঁত থেকে দূরে ....

echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}

2

যাঁরা নিয়মিত ইমাস ব্যবহার করছেন তাদের ক্ষেত্রে তারা নিম্নলিখিতটি দরকারী খুঁজে পেতে পারেন (রূপান্তরটি নিজেই পরিদর্শন ও বৈধ করার অনুমতি দেয়)।

তবুও আমি প্রায়শই দেখতে পাই যে ইমাস চার্-সেট স্বয়ংক্রিয় সনাক্তকরণ অন্যান্য চর-সেট স্বয়ংক্রিয় সনাক্তকরণ সরঞ্জামগুলির (যেমন চারডেট) এর চেয়ে অনেক বেশি দক্ষ।

(setq paths (mapcar 'file-truename '(
 "path/to/file1"
 "path/to/file2"
 "path/to/file3"
)))

(dolist (path paths)
  (find-file path)
  (set-buffer-file-coding-system 'utf-8-unix)
  )

তারপরে, যুক্তি হিসাবে এই স্ক্রিপ্টের সাথে ইমাসকে একটি সাধারণ কল ("-l" বিকল্পটি দেখুন) কাজ করে।



0

isutf8( moreutilsপ্যাকেজ থেকে ) কাজটি করেছে


2
কিভাবে? এই উত্তরটি সত্যিই সহায়ক নয়।
মোশি 19

1
এটি ঠিক জিজ্ঞাসা করা হয়নি, তবে এটি একটি দরকারী সরঞ্জাম। ফাইলটি বৈধ UTF-8 হয়, প্রস্থান স্থিতি শূন্য। ফাইলটি বৈধ UTF-8 না হলে বা কিছু ত্রুটি থাকলে প্রস্থান স্থিতি শূন্য নয় non
টন

0

এছাড়াও আপনি ফাইল -i আপনাকে অজানা দেয়

আপনি এই পিএইচপি কমান্ডটি ব্যবহার করতে পারেন যা নীচের মতো চরসেট অনুমান করতে পারে:

পিএইচপি তে আপনি নীচের মত চেক করতে পারেন:

এনকোডিং তালিকা স্পষ্টভাবে উল্লেখ করা:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

আরও সঠিক " এমবি_লিস্ট_নোকডিংস ":

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

এখানে প্রথম উদাহরণে আপনি দেখতে পাচ্ছেন যে আমি মেলানো হতে পারে এমন এনকোডিংগুলির একটি তালিকা রেখেছি (তালিকার ক্রম সনাক্ত করুন)। আরও সঠিক ফলাফল পেতে আপনি সমস্ত সম্ভাব্য এনকোডিংগুলি এর মাধ্যমে ব্যবহার করতে পারেন: mb_list_encodings ()

নোট এমবি_ * ফাংশনগুলির জন্য পিএইচপি-এমবিস্ট্রিং প্রয়োজন

apt-get install php-mbstring 

উত্তর দেখুন: https://stackoverflow.com/a/57010566/3382822

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.