লিনাক্সে স্ক্রিপ্টের মাধ্যমে কোনও ফাইলের এনকোডিং কীভাবে পাওয়া যায়?


303

আমাকে ডিরেক্টরিতে থাকা সমস্ত ফাইলের এনকোডিং সন্ধান করতে হবে। ব্যবহৃত এনকোডিংটি খুঁজে পাওয়ার কোনও উপায় আছে?

দ্য fileকমান্ড এই কাজ করতে সক্ষম নয়।

আমার কাছে আগ্রহী এনকোডিংটি হ'ল: আইএসও -8859-1। যদি এনকোডিং অন্য কিছু হয় তবে আমি ফাইলটি অন্য ডিরেক্টরিতে সরাতে চাই।


1
আপনি কী ধরণের স্ক্রিপ্টিং ভাষা ব্যবহার করতে পারেন সে সম্পর্কে আপনার যদি ধারণা থাকে তবে আপনার প্রশ্নটি সেই ভাষার নামের সাথে ট্যাগ করুন। এটি সাহায্য করতে পারে ...
ম্যাট্রিক্সফ্রোগ

1
অথবা হতে পারে সে কেবল শেল স্ক্রিপ্ট তৈরির চেষ্টা করছে?
শালম ক্রিমার

1
যা "কোন স্ক্রিপ্টিং ভাষা" এর একটি উত্তর হবে।
এএম

7
সম্ভবত এই উত্তরের সাথে সম্পর্কিত নয়, তবে সাধারণভাবে একটি পরামর্শ: আপনি যখন নিজের সম্পূর্ণ সন্দেহকে এক কথায় ("এনকোডিং", এখানে) বর্ণনা করতে পারেন, ঠিক তখনই করুন apropos encoding। এটি সমস্ত ম্যানেজগুলির শিরোনাম এবং বিবরণ সন্ধান করে। যখন আমি আমার মেশিনে এটি করেন, আমি 3 টুলস যে আমাকে সাহায্য করতে পারে দেখেন, তখন তাদের বিবরণ দ্বারা বিচার: chardet, chardet3, chardetect3। তারপরে, man chardetম্যানপেজটি করে এবং পড়ার মাধ্যমে আমাকে জানায় যে chardetএটি আমার প্রয়োজনীয় ইউটিলিটি।
জন রেড

1
আপনি যখন কোনও ফাইলের সামগ্রী পরিবর্তন করেন তখন এনকোডিংটি পরিবর্তন হতে পারে। উদাহরণস্বরূপ, vi এ, যখন একটি সাধারণ সি প্রোগ্রাম লিখুন, সম্ভবত এটিই us-asciiহতে পারে তবে চীনা মন্তব্যের একটি লাইন যুক্ত করার পরে এটি হয়ে যায় utf-8fileফাইলের সামগ্রী এবং অনুমানটি পড়ে এনকোডিংটি বলতে পারে।
এরিক ওয়াং

উত্তর:


419

মনে হচ্ছে আপনি খুঁজছেন enca। এটি অনুমান এবং এমনকি এনকোডিংগুলির মধ্যে রূপান্তর করতে পারে। শুধু তাকান man পৃষ্ঠা

বা, এটি ব্যর্থ হয়ে file -i(লিনাক্স) বা file -I(অক্স) ব্যবহার করুন। এটি ফাইলের জন্য মাইমাম-টাইপ তথ্য আউটপুট দেবে, এতে অক্ষর-সেট এনকোডিংও অন্তর্ভুক্ত থাকবে। আমি এর জন্য একটি ম্যান-পৃষ্ঠাও পেয়েছি :)


1
ম্যান পৃষ্ঠা অনুসারে, এটি আইএসও 8559 সেট সম্পর্কে জানে। সম্ভবত কিছুটা কম
কর্সরালি পড়ুন

5
এনকা আকর্ষণীয় মনে হচ্ছে। দুর্ভাগ্যক্রমে সনাক্তকরণটি খুব ভাষা নির্ভর করে এবং সমর্থিত ভাষার সেট খুব বড় নয় very খনি (ডি) অনুপস্থিত :-( যাই হোক টুল ঠান্ডা।
er4z0r


6
encaইংরেজিতে লিখিত কোনও ফাইল বিশ্লেষণের জন্য পুরোপুরি অকেজো বলে মনে হয়, তবে আপনি যদি এস্তোনীয় ভাষায় কোনও কিছুর দিকে তাকিয়ে থাকেন তবে এটি আপনার সমস্ত সমস্যার সমাধান করতে পারে। খুব সহায়ক একটি সরঞ্জাম, এটি ... </
সার্কাসম

6
@ ভ্লাদক্রাস যদি আপনার ইউটিএফ -8 ফাইলে অ-আসকি চরগুলি না থাকে তবে এটি
আসকি

85
file -bi <file name>

আপনি যদি গুচ্ছ ফাইলগুলির জন্য এটি করতে চান

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done

তবে, xML ঘোষণায় "এনকোডিং = 'আইসো -8859-1' বৈশিষ্ট্যযুক্ত ফাইলটি যদি কোনও এক্সএমএল ফাইল হয় তবে ফাইল কমান্ডটি এটি একটি আইসো ফাইলই বলবে, এমনকি যদি সত্যিকারের এনকোডিং utf-8 হয় ...
প্রতি

6
আপনি -b যুক্তিটি ব্যবহার করেন কেন? আপনি যদি কেবল ফাইল -i * করেন তবে এটি প্রতিটি ফাইলের জন্য অনুমান করা চারসেট আউটপুট করে।
হ্যান্স-পিটার স্টার

4
আমি-বি যুক্তি সম্পর্কেও কৌতূহল ছিলাম। ম্যান পেজটি এর অর্থ "সংক্ষিপ্ত"Do not prepend filenames to output lines
ক্র্যাক

1
ফাইল আউটপুট বিশ্লেষণ করার দরকার নেই, file -b --mime-encodingকেবল
চরসেট

-b এর অর্থ দাঁড়ায় 'বিট ব্রিফ' যার অর্থ হ'ল আপনার সবে দেওয়া ফাইলটির আউটপুট আউট করবেন না।
নিকোস

36

uchardet - মজিলা থেকে পোর্ট করা একটি এনকোডিং ডিটেক্টর লাইব্রেরি।

ব্যবহার:

~> uchardet file.java 
UTF-8

বিভিন্ন লিনাক্স বিতরণ (দেবিয়ান / উবুন্টু, ওপেনসুস-প্যাকম্যান, ...) বাইনারি সরবরাহ করে।


1
ধন্যবাদ! আমি এখনো আরো প্যাকেজ আনন্দিত না, এখনো sudo apt-get install uchardetএত সহজ যে আমি এটা সম্পর্কে চিন্তা করতে না করার সিদ্ধান্ত হচ্ছে ...
ঋষি

আমি কেবল উপরের মন্তব্যে যেমন বলেছিলাম: উকারেডেট আমাকে মিথ্যাভাবে বলেছে যে কোনও ফাইলের এনকোডিং ছিল "উইন্ডোজ -১২২২", যদিও আমি সেই ফাইলটি ইউটিএফ -8 হিসাবে স্পষ্টভাবে সংরক্ষণ করেছি। uchardet এমনকি "আত্মবিশ্বাসের সাথে 0.4641618497109827" বলে না যা কমপক্ষে আপনাকে একটি ইঙ্গিত দেয় যে এটি আপনাকে সম্পূর্ণ বাজে কথা বলেছে telling ফাইল, এনকা এবং ছদ্মবেশী সঠিকভাবে কাজ করেছে।
আলগোম্যান

uchardetএর একটি বড় সুবিধা রয়েছে fileএবং encaএটি পুরো ফাইলটিকে বিশ্লেষণ করে (কেবলমাত্র 20GiB ফাইল দিয়ে চেষ্টা করেছিল) কেবল শুরুর বিপরীতে।
tuxayo

10

এখানে ফাইল -I এবং আইকনভি ব্যবহার করে একটি স্ক্রিপ্ট রয়েছে যা ম্যাকওএসএক্স-এ কাজ করে আপনার প্রশ্নের জন্য আপনার আইকনভিয়ের পরিবর্তে এমভি ব্যবহার করতে হবে

#!/bin/bash
# 2016-02-08
# check encoding and convert files
for f in *.java
do
  encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=`
  case $encoding in
    iso-8859-1)
    iconv -f iso8859-1 -t utf-8 $f > $f.utf8
    mv $f.utf8 $f
    ;;
  esac
done

6
file -b --mime-encodingকেবল
চরসেট

1
ধন্যবাদ. ম্যাকোস-এ নির্দেশিত হিসাবে এটি কাজ করবে না: ফাইল-বি - মাইম-এনকোডিংয়ের ব্যবহার: ফাইল [-bchikLNnprsvz0] [-e পরীক্ষা] [-ফ নামফলক] [-এফ বিভাজনকারী] [-ম ম্যাজিক ফাইলস] [-ম ম্যাজিক ফাইলস ] ফাইল ... ফাইল-সি-এম ম্যাজিকফায়াল আরও তথ্যের জন্য 'ফাইল - হেল্প' চেষ্টা করুন।
ওল্ফগ্যাং ফাহল

6

এটি আইসো -8859-1 কিনা তা নির্ধারণ করা সত্যিই শক্ত। যদি আপনার কাছে কেবল 7 বিট অক্ষরযুক্ত একটি পাঠ্য থাকে যা আইসো -8859-1ও হতে পারে তবে আপনি জানেন না। আপনার যদি 8 বিট অক্ষর থাকে তবে উপরের অঞ্চলের অক্ষরগুলি ক্রম এনকোডিংগুলিতেও উপস্থিত থাকে। এর জন্য আপনাকে কোন শব্দটি কোন শব্দটি অনুধাবন করতে হবে এবং সেখান থেকে এটি অবশ্যই কোন বর্ণের হতে হবে তা নির্ধারণ করতে হবে। অবশেষে যদি আপনি সনাক্ত করেন যে এটি আপনার চেয়ে নিশ্চিত যে এটি আউট -8 হ'ল এটি আইসো -8859-1 নয়

এনকোডিং করানো সবচেয়ে কঠিন কাজগুলির একটি কারণ আপনি কখনই জানেন না যে কিছুই আপনাকে না বলছে


এটি জোর করার চেষ্টা করতে সহায়তা করতে পারে। নিম্নলিখিত কমান্ডটি উইন বা আইএসও দিয়ে শুরু হওয়া নামগুলি সহ সমস্ত একনকোডিং ফর্ম্যাটগুলি থেকে ইউটিএফ 8 তে রূপান্তর করার চেষ্টা করবে। তারপরে একটি ডান এনকোডিংয়ের একটি সন্ধানের জন্য ম্যানুয়ালি আউটপুট পরীক্ষা করতে হবে। অবশ্যই, আপনি কোনও উপযুক্ত কিছুর জন্য আইএসও বা ডাব্লুআইএন প্রতিস্থাপন ফিল্টার ফর্ম্যাটগুলি পরিবর্তন করতে পারেন বা গ্রেপ কমান্ডটি সরিয়ে ফিল্টারটি সরাতে পারেন। আমি $ (আইকনভি-এল | লেজ -n +2 | গ্রেপ "(^ আইএসও \ | ^ উইন)" | সেড-ই 's / \ / \ ///') এর জন্য; প্রতিধ্বনি করুন $ i; iconv -f f i -t UTF8 santos; সম্পন্ন;
এনডিভো

5

ডেবিয়ান এ আপনি এটি ব্যবহার করতে পারেন encguess:

$ encguess test.txt
test.txt  US-ASCII

আমি uchardetউবুন্টুতে ইনস্টল করেছি এবং এটি আমাকে বলেছিল যে আমার ফাইলটি WINDOWS-1252। আমি জানি এটি ভুল ছিল কারণ পরীক্ষার জন্য আমি কেটের সাথে এটি ইউটিএফ -16 হিসাবে সংরক্ষণ করেছি। তবে encguessসঠিকভাবে অনুমান করুন এবং এটি উবুন্টু 19.04-এ প্রাক ইনস্টল করা হয়েছিল।
নাগেভ

5

8859 থেকে এএসসিআইআইতে এনকোডিং রূপান্তর করতে:

iconv -f ISO_8859-1 -t ASCII filename.txt

4

পাইথনের সাহায্যে আপনি চারডেট মডিউলটি ব্যবহার করতে পারেন: https://github.com/chardet/chardet


অ-বিদ্যমান ডোমেন: feedparser.org
রুন

এই মন্তব্য হিসাবে, এটি এখনও গিথুব এ
রিক হ্যানলন II

এই মন্তব্য হিসাবে, এটি গিথুবে চার্টেট / চারডিটে রয়েছে। আপডেট উত্তর।
কোয়ান্টিন প্রদেট

চারডেট "কিছুই নয়" হিসাবে রিপোর্ট করেছে , আমার অজগর স্ক্রিপ্টটি ঠিক একইভাবে ফাইলের প্রথম লাইনে Chardet3 টি বন্ধ করেছে ।
জোয়েস এলফ

3

এটি এমন কোনও জিনিস নয় যা আপনি বোকা প্রতিরোধী উপায়ে করতে পারেন। একটি সম্ভাবনা হ'ল ফাইলের প্রতিটি চরিত্রের পরীক্ষা করে এটি নিশ্চিত করা হবে যে এতে রেঞ্জগুলিতে কোনও অক্ষর নেই 0x00 - 0x1fবা 0x7f -0x9fযেমন, আমি যেমন বলেছি, এটি আইএসও 8859 এর অন্তত একটি অন্য রূপ সহ কোনও সংখ্যক ফাইলের ক্ষেত্রেই সত্য হতে পারে।

আরেকটি সম্ভাবনা হ'ল সমর্থিত সমস্ত ভাষার ফাইলের নির্দিষ্ট শব্দগুলির সন্ধান এবং আপনি সেগুলি খুঁজে পেতে পারেন কিনা তা দেখুন।

সুতরাং, উদাহরণস্বরূপ, 8859-1 এর সমস্ত সমর্থিত ভাষায় ইংরেজি "এবং", "তবে", "তবে", "এর" এর সমতুল্য সন্ধান করুন এবং দেখুন যে তাদের মধ্যে বৃহত সংখ্যক উপস্থিতি আছে কিনা ফাইল।

আমি যেমন আক্ষরিক অনুবাদ সম্পর্কে কথা বলছি না:

English   French
-------   ------
of        de, du
and       et
the       le, la, les

যদিও এটি সম্ভব আমি লক্ষ্য ভাষায় প্রচলিত শব্দের কথা বলছি (সবার জন্য আমি জানি, আইসল্যান্ডিয়ান "" এবং "এর জন্য কোনও শব্দ রাখে না - আপনার সম্ভবত তাদের" মাছ "জন্য শব্দটি ব্যবহার করতে হবে [দুঃখিত যে এটি একটি সামান্য গোঁড়ামিযুক্ত, আমি না কোনও অপরাধ মানে, কেবল একটি পয়েন্ট চিত্রিত করে])।


2

আমি জানি আপনি আরও সাধারণ উত্তরের বিষয়ে আগ্রহী, তবে ASCII এ যা ভাল তা সাধারণত অন্যান্য এনকোডিংগুলিতে ভাল। স্ট্যান্ডার্ড ইনপুট ASCII কিনা তা নির্ধারণ করতে এখানে পাইথন ওয়ান-লাইনার রয়েছে। (আমি নিশ্চিত যে এটি পাইথন 2 এ কাজ করে, তবে আমি কেবল এটি পাইথন 3 এ পরীক্ষা করেছি tested)

python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt

2

আপনি যদি এক্সএমএল-ফাইলগুলির কথা বলছেন (আইএসও -8859-1), তাদের মধ্যে থাকা এক্সএমএল-ঘোষণাটি এনকোডিং নির্দিষ্ট করে: <?xml version="1.0" encoding="ISO-8859-1" ?>
সুতরাং, আপনি এই perlজাতীয় স্পেসিফিকেশনের জন্য প্রতিটি ফাইল পরীক্ষা করতে নিয়মিত এক্সপ্রেশন (উদাহরণস্বরূপ ) ব্যবহার করতে পারেন ।
আরও তথ্য এখানে পাওয়া যাবে: পাঠ্য ফাইল এনকোডিং কীভাবে নির্ধারণ করবেন


ভাল সেই লাইনটি এমন কোনও ব্যক্তির দ্বারা অনুলিপি করা যাবে যা জানেন না যে তিনি কী এনকোডিং ব্যবহার করছেন।
আলগোম্যান 3:38

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

2

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

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

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

0

সাইগউইনে, দেখে মনে হচ্ছে এটি আমার পক্ষে কাজ করে:

find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done

উদাহরণ:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done

আপনি আইকনভিভিত্তিক কোনও উত্স এনকোডিং থেকে, উত্সাহিত করার জন্য আইকনভি কমান্ড তৈরি করে সবকিছুকে ইউএফ 8 তে রূপান্তর করতে আইকন কমান্ড তৈরি করতে পারেন।

উদাহরণ:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash

0

আপনি ফাইল কমান্ডের সাহায্যে একক ফাইলের এনকোডিং বের করতে পারেন। আমার সাথে একটি নমুনা html ফাইল রয়েছে:

$ file sample.html 

নমুনা.এইচটিএমএল: এইচটিএমএল ডকুমেন্ট, ইউটিএফ -8 ইউনিকোড পাঠ্য, খুব দীর্ঘ লাইনের সাথে

$ file -b sample.html

এইচটিএমএল ডকুমেন্ট, খুব দীর্ঘ রেখার সাথে ইউটিএফ -8 ইউনিকোড পাঠ্য

$ file -bi sample.html

পাঠ্য / HTML; অক্ষরসেট = UTF-8

$ file -bi sample.html  | awk -F'=' '{print $2 }'

UTF-8


1
আমি যে আউটপুটটি পাই তা হ'ল "নিয়মিত ফাইল"
মর্দচাই 11:58

0

আমি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করছি

  1. এসআরসি_ইনকোডিংয়ের সাথে ফিল্টার মেলে এমন সমস্ত ফাইল সন্ধান করুন
  2. এগুলির একটি ব্যাকআপ তৈরি করুন
  3. এগুলি DST_ENCODING এ রূপান্তর করুন
  4. (alচ্ছিক) ব্যাকআপগুলি সরান

#!/bin/bash -xe

SRC_ENCODING="iso-8859-1"
DST_ENCODING="utf-8"
FILTER="*.java"

echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER"
FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*\.java')

for FILE in $FOUND_FILES ; do
    ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp"
    echo "Backup original file to $ORIGINAL_FILE"
    mv "$FILE" "$ORIGINAL_FILE"

    echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
    iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"
done

echo "Deleting backups"
find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;

0

এই আদেশ সহ:

for f in `find .`; do echo `file -i "$f"`; done

আপনি একটি ডিরেক্টরি এবং উপ-ডিরেক্টরি এবং সংশ্লিষ্ট এনকোডিংয়ে সমস্ত ফাইল তালিকাভুক্ত করতে পারেন।


-2

পার্লের সাহায্যে এনকোড :: সনাক্ত করুন use


7
শেল এটি কীভাবে ব্যবহার করবেন আপনি একটি উদাহরণ দিতে পারেন?
Lri

আর একটি পোস্টার (@fccoelho) সমাধান হিসাবে পাইথন মডিউল সরবরাহ করেছে যা একটি +3 পায় এবং এই পোস্টারটি পার্ল মডিউলের ব্যতীত খুব অনুরূপ উত্তরের জন্য একটি -2 পায়। দ্বৈত মান কেন ?!
শুভ গ্রিন কিড নেপস

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