लिनक्स पर स्क्रिप्ट के माध्यम से फ़ाइल की एन्कोडिंग कैसे खोजें?


303

मुझे उन सभी फ़ाइलों की एन्कोडिंग खोजने की आवश्यकता है जो एक निर्देशिका में रखी गई हैं। वहाँ इस्तेमाल किया एन्कोडिंग खोजने के लिए एक रास्ता है?

fileआदेश यह करने के लिए सक्षम नहीं है।

जो एन्कोडिंग मेरे लिए हितकारी है, वह है: ISO-8859-1। यदि एन्कोडिंग कुछ और है, तो मैं फ़ाइल को किसी अन्य निर्देशिका में स्थानांतरित करना चाहता हूं।


1
यदि आपको इस बात का अंदाजा है कि आप किस प्रकार की स्क्रिप्टिंग भाषा का उपयोग करना चाहते हैं, तो उस भाषा के नाम के साथ अपने प्रश्न को टैग करें। इससे मदद मिल सकती है ...
MatrixFrog

1
या हो सकता है कि वह सिर्फ एक शेल स्क्रिप्ट बनाने की कोशिश कर रहा हो?
शालोम क्रेमर

1
जो "भाषा की पटकथा" का एक उत्तर होगा।
bignose

7
शायद इस जवाब से संबंधित नहीं है, लेकिन सामान्य रूप से एक टिप: जब आप एक शब्द ("एन्कोडिंग", यहां) में अपने पूरे संदेह का वर्णन कर सकते हैं, तो बस करें apropos encoding। यह सभी मैनपावर के शीर्षक और विवरण को खोजता है। जब मैं अपने मशीन पर यह करते हैं, मैं 3 उपकरण है कि मुझे मदद कर सकता है देखते हैं, उनके विवरण से पहचानने: chardet, chardet3, chardetect3। फिर, man chardetमैनपेज को पढ़ने और पढ़ने से मुझे पता चलता chardetहै कि मुझे केवल उपयोगिता की आवश्यकता है।
जॉन रेड

1
जब आप किसी फ़ाइल की सामग्री बदलते हैं तो एन्कोडिंग बदल सकती है। उदाहरण के लिए vi में, जब एक साधारण सी प्रोग्राम लिखते हैं, तो यह संभवतः है us-ascii, लेकिन चीनी टिप्पणी की एक पंक्ति जोड़ने के बाद, यह बन जाता है utf-8fileफ़ाइल सामग्री और अनुमान पढ़कर एन्कोडिंग बता सकते हैं।
एरिक वांग

जवाबों:


419

लगता है जैसे आप खोज रहे हैं enca। यह अनुमान लगा सकता है और यहां तक ​​कि एन्कोडिंग के बीच भी परिवर्तित हो सकता है। बस मैन पेज को देखो ।

या, उसको विफल करते हुए, file -i(linux) या file -I(osx) का उपयोग करें। यह फ़ाइल के लिए MIME- प्रकार की जानकारी को आउटपुट करेगा, जिसमें कैरेक्टर-सेट एन्कोडिंग भी शामिल होगी। मुझे इसके लिए एक मैन-पेज मिला , :)


1
मैन पेज के अनुसार, यह आईएसओ 8559 सेट के बारे में जानता है। शायद थोड़ा कम पढ़ें। :-)
bignose

5
एनका दिलचस्प लगता है। दुर्भाग्य से पता लगाना बहुत भाषा पर निर्भर लगता है और समर्थित भाषाओं का सेट बहुत बड़ा नहीं है। मेरा (डी) गायब है :-( वैसे भी शांत उपकरण।
er4z0r


6
encaअंग्रेजी में लिखी गई फ़ाइल का विश्लेषण करने के लिए पूरी तरह से बेकार प्रतीत होता है, लेकिन अगर आप एस्टोनियाई में कुछ देख रहे हैं, तो यह सभी समस्याओं को हल कर सकता है। बहुत उपयोगी उपकरण, कि ... </ व्यंग्य>
cbmanica

6
@vladkras अगर आपकी utf-8 फाइल में कोई गैर-असिस्की चरस नहीं हैं, तो यह ascii से अप्रभेद्य है :)
vadipp

85
file -bi <file name>

यदि आप फ़ाइलों के एक समूह के लिए ऐसा करना पसंद करते हैं

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

हालाँकि, यदि फ़ाइल xml फ़ाइल है, तो xml घोषणा में "एन्कोडिंग = 'iso-8859-1' विशेषता के साथ, फ़ाइल कमांड इसे एक आईएसओ फ़ाइल कहेगी, भले ही सही एन्कोडिंग utf-8 हो ...
प्रति

6
आप -b तर्क का उपयोग क्यों करते हैं? यदि आप सिर्फ फ़ाइल -i * करते हैं, तो यह हर फ़ाइल के लिए अनुमानित चार्ट को आउटपुट करता है।
हंस-पीटर स्टॉर जूनियर

4
-बी तर्क को लेकर भी मैं उत्सुक था। मैन पेज कहता है कि इसका मतलब है "संक्षिप्त"Do not prepend filenames to output lines
सन 1947 में 16:12

1
फ़ाइल आउटपुट को पार्स करने की कोई आवश्यकता नहीं है, file -b --mime-encodingकेवल चारसेट एन्कोडिंग आउटपुट
जेस्जिमेर

-b का अर्थ 'संक्षिप्त होना' है जिसका मूल अर्थ है कि आपके द्वारा दिए गए फ़ाइल नाम का उत्पादन न करना।
निकोस

36

uchardet - एक एन्कोडिंग डिटेक्टर पुस्तकालय मोज़िला से पोर्ट किया गया।

उपयोग:

~> uchardet file.java 
UTF-8

विभिन्न लिनक्स वितरण (डेबियन / Ubuntu, OpenSuse-packman, ...) बायनेरिज़ प्रदान करते हैं।


1
धन्यवाद! मैं अभी तक अधिक पैकेजों के बारे में खुश नहीं हूं, फिर sudo apt-get install uchardetभी इतना आसान है कि मैंने इसके बारे में चिंता न करने का फैसला किया ...
ऋषि

जैसा कि मैंने अभी ऊपर एक टिप्पणी में कहा था: uchardet मुझे झूठा बताता है कि एक फ़ाइल की एन्कोडिंग "विंडोज़ -1252" थी, हालांकि मैंने स्पष्ट रूप से उस फ़ाइल को UTF-8 के रूप में सहेजा था। uchardet यह भी नहीं कहता है "आत्मविश्वास के साथ 0.4641618497109827" जो कम से कम आपको एक संकेत देगा कि यह आपको पूरी बकवास बता रहा है। फ़ाइल, एन्का और एनगेसिस ने सही तरीके से काम किया।
अल्गोमन

uchardetपर एक बड़ा फायदा है fileऔर encaमें है कि यह पूरी फ़ाइल (सिर्फ एक 20GiB फ़ाइल के साथ करने की कोशिश की) का विश्लेषण करती है के रूप में केवल शुरुआत करने का विरोध किया,।
tuxayo

10

यहाँ फ़ाइल -I और iconv का उपयोग करके एक उदाहरण स्क्रिप्ट दी गई है जो MacOsX पर काम करती है। आपके प्रश्न के लिए आपको iconv के बजाय mv का उपयोग करने की आवश्यकता है

#!/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आउटपुट सिर्फ चारसेट होता है, जिससे आप सभी पाइप प्रोसेसिंग से बच सकते हैं
jesjimher

1
धन्यवाद। जैसा कि MacOS पर बताया गया है कि यह काम नहीं करेगा: फ़ाइल -b - माइम-एन्कोडिंग उपयोग: फ़ाइल [-bchikLNnprsvz0] [-e परीक्षण] [-f namefile] [-F विभाजक] [-m Magicfiles] [-M मैजिकफाइल्स ] फ़ाइल ... फ़ाइल -C मैमफ़ाइल्स अधिक जानकारी के लिए `फ़ाइल --help 'आज़माएँ।
वोल्फगैंग फाहल

6

यह निर्धारित करना वास्तव में कठिन है कि यह iso-8859-1 है या नहीं। यदि आपके पास केवल 7 बिट वर्णों वाला एक पाठ है, जो iso-8859-1 भी हो सकता है, लेकिन आप नहीं जानते। यदि आपके पास 8 बिट वर्ण हैं तो ऊपरी क्षेत्र के वर्ण क्रम एन्कोडिंग में भी मौजूद हैं। इसके लिए आपको एक बेहतर अनुमान प्राप्त करने के लिए एक शब्दकोश का उपयोग करना होगा जो यह शब्द है और यह निर्धारित करता है कि यह किस अक्षर से होना चाहिए। अंत में यदि आप यह पता लगाते हैं कि यह utf-8 हो सकता है तो आप सुनिश्चित करें कि यह iso-8859-1 नहीं है

एन्कोडिंग सबसे मुश्किल काम है क्योंकि आप कभी नहीं जानते हैं कि कुछ भी आपको नहीं बता रहा है


यह बल को भंग करने की कोशिश करने में मदद कर सकता है। निम्न आदेश सभी इन्नकोडिंग स्वरूपों से उन नामों से परिवर्तित करने का प्रयास करेगा जो विन या आईएसओ से शुरू होकर UTF8 में आते हैं। फिर किसी को मैन्युअल रूप से सही एन्कोडिंग में सुराग के लिए खोज आउटपुट की जांच करने की आवश्यकता होगी। बेशक, आप आईएसओ के लिए फ़िल्टर किए गए प्रारूपों को बदल सकते हैं या कुछ उपयुक्त के लिए जीत सकते हैं या grep कमांड को हटाकर फ़िल्टर को हटा सकते हैं। $ i में (iconv -l | tail -n +2 | grep "(^ ISO \ | ^ विन)" | sed -e 's / \ / \ ///') $ इको करो; iconv -f $ i -t UTF8 santos; किया हुआ;
ndvo

5

डेबियन में आप भी उपयोग कर सकते हैं encguess:

$ encguess test.txt
test.txt  US-ASCII

मैं uchardetउबंटू में स्थापित हुआ और इसने मुझे बताया कि मेरी फाइल थी WINDOWS-1252। मुझे पता है कि यह गलत था क्योंकि मैंने इसे परीक्षण के लिए केट के साथ UTF-16 के रूप में सहेजा था। हालाँकि, encguessसही ढंग से अनुमान लगाते हैं, और यह Ubuntu 19.04 में पूर्व-स्थापित था।
नागदेव

5

एन्कोडिंग को 8859 से ASCII में बदलने के लिए:

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

4

पायथन के साथ, आप chardet मॉड्यूल का उपयोग कर सकते हैं: https://github.com/chardet/chardet


गैर-मौजूदा डोमेन: feedparser.org
Rune

इस टिप्पणी के अनुसार, यह Github पर अभी भी उपलब्ध है: github.com/dcramer/chardet
रिक हैनलोन II

इस टिप्पणी के अनुसार, यह github पर chardet / chardet पर है। अद्यतन उत्तर।
क्वेंटिन प्रदीप

chardet की रिपोर्ट "कोई नहीं", chardet3 फ़ाइल की पहली पंक्ति पर ठीक उसी तरह से चुटकी लेता है जैसे मेरी पाइथन स्क्रिप्ट करती है।
जोएलस एल्फ

3

यह कुछ ऐसा नहीं है जिसे आप मूर्खतापूर्ण तरीके से कर सकते हैं। एक संभावना यह है कि यह सुनिश्चित करने के लिए फ़ाइल में हर वर्ण की जांच होगी कि इसमें कोई वर्ण शामिल नहीं है 0x00 - 0x1fया 0x7f -0x9fलेकिन, जैसा कि मैंने कहा, यह किसी भी संख्या में फ़ाइलों के लिए सही हो सकता है, जिसमें ISO8859 का कम से कम एक अन्य संस्करण भी शामिल है।

एक और संभावना है समर्थित सभी भाषाओं में फ़ाइल में विशिष्ट शब्दों की तलाश करें और देखें कि क्या आप उन्हें पा सकते हैं।

इसलिए, उदाहरण के लिए, 8859-1 की सभी समर्थित भाषाओं में "और", "लेकिन", "से", "के बराबर और" अंग्रेजी के समान खोजें "और देखें कि क्या उनके पास घटनाओं की एक बड़ी संख्या है फ़ाइल।

मैं शाब्दिक अनुवाद के बारे में बात नहीं कर रहा हूँ जैसे:

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

हालांकि यह संभव है। मैं लक्ष्य भाषा में सामान्य शब्दों के बारे में बात कर रहा हूं (सभी के लिए मैं जानता हूं, आइसलैंडिक में कोई शब्द नहीं है "और" - आपको शायद "मछली" के लिए उनके शब्द का उपयोग करना होगा [क्षमा करें कि थोड़ा रूढ़िवादी है, मैंने नहीं किया था) किसी भी अपराध का मतलब है, बस एक बिंदु पर प्रकाश डालना])।


2

मुझे पता है कि आप अधिक सामान्य उत्तर में रुचि रखते हैं, लेकिन ASCII में जो अच्छा है वह आमतौर पर अन्य एन्कोडिंग में अच्छा है। मानक इनपुट ASCII है या नहीं यह निर्धारित करने के लिए एक पायथन वन-लाइनर है। (मुझे पूरा यकीन है कि यह पायथन 2 में काम करता है, लेकिन मैंने केवल पायथन 3 पर इसका परीक्षण किया है)

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

यदि आप XML-files (ISO-8859-1) के बारे में बात कर रहे हैं, तो उनके अंदर की XML-घोषणा एन्कोडिंग को निर्दिष्ट करती है: <?xml version="1.0" encoding="ISO-8859-1" ?>
इसलिए, आप perlऐसे विनिर्देशन के लिए प्रत्येक फ़ाइल की जांच करने के लिए नियमित भाव (जैसे ) का उपयोग कर सकते हैं ।
अधिक जानकारी यहां पाई जा सकती है: टेक्स्ट फाइल एनकोडिंग का निर्धारण कैसे करें


अच्छी तरह से उस लाइन को कॉपी-एन-पेस्ट किया जा सकता है जो किसी को नहीं जानता कि वह किस एन्कोडिंग का उपयोग कर रहा है।
अल्गोमन

सावधानी के शब्द, शीर्ष पर घोषणा के बारे में कुछ भी नहीं की गारंटी देता है फ़ाइल ACTUALLY उस तरह से एन्कोडेड है। यदि आप वास्तव में, वास्तव में एन्कोडिंग के बारे में परवाह करते हैं, तो आपको इसे स्वयं को सत्यापित करने की आवश्यकता है।
जैजपीई

2

Php में आप नीचे की तरह देख सकते हैं:

स्पष्ट रूप से एन्कोडिंग सूची निर्दिष्ट करना:

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

अधिक सटीक "mb_list_encodings":

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

यहाँ पहले उदाहरण में, आप देख सकते हैं कि मैं एन्कोडिंग (सूची क्रम का पता लगाने) की एक सूची रखता हूँ जो मिलान हो सकता है। अधिक सटीक परिणाम के लिए आप सभी संभव एन्कोडिंग का उपयोग कर सकते हैं: mb_list_encodings ()

नोट mb_ * फ़ंक्शंस के लिए php-mbstring की आवश्यकता होती है

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

आप उस पाइप को जागृत कर सकते हैं और iconv द्वारा समर्थित किसी भी स्रोत एन्कोडिंग से, सब कुछ utf8 में बदलने के लिए एक iconv कमांड बना सकते हैं।

उदाहरण:

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 

sample.html: HTML डॉक्यूमेंट, UTF-8 यूनिकोड टेक्स्ट, बहुत लंबी लाइनों के साथ

$ file -b sample.html

HTML दस्तावेज़, UTF-8 यूनिकोड पाठ, बहुत लंबी लाइनों के साथ

$ file -bi sample.html

text / html; charset = utf-8

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

utf-8


1
मुझे जो आउटपुट मिलता है वह है "नियमित फाइल"
मोर्दकै

0

मैं निम्नलिखित स्क्रिप्ट का उपयोग कर रहा हूं

  1. सभी फ़ाइलें खोजें जो SRC_ENCODING के साथ FILTER से मेल खाती हों
  2. उनका बैकअप बनाएं
  3. उन्हें DST_ENCODING में कनवर्ट करें
  4. (वैकल्पिक) बैकअप निकालें

#!/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

पर्ल के साथ, एनकोड :: डिटेक्ट का उपयोग करें।


7
क्या आप एक उदाहरण दे सकते हैं कि इसे शेल में कैसे उपयोग किया जाए?
LRI

एक अन्य पोस्टर (@fccoelho) ने पायथन मॉड्यूल को एक समाधान के रूप में प्रदान किया जो कि +3 मिलता है और इस पोस्टर को एक बहुत ही समान उत्तर के लिए -2 मिलता है, सिवाय इसके कि यह एक पर्ल मॉड्यूल के लिए है। डबल स्टैंडर्ड क्यों ?!
हैप्पी ग्रीन किड नेप्स

4
शायद एक पर्ल-लाइनर का एक कोड उदाहरण इस जवाब में मदद करेगा।
8
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.