मैं एक अजीब चरित्र की पहचान कैसे कर सकता हूं?


10

मैं एक अजीब चरित्र की पहचान करने की कोशिश कर रहा हूं जो मुझे उस फ़ाइल में मिला है जिसके साथ मैं काम कर रहा हूं:

$ cat file
�
$ od file
0000000 005353
0000002
$ od -c file
0000000 353  \n
0000002
$ od -x file
0000000 0aeb
0000002

फ़ाइल ISO-8859 एन्कोडिंग का उपयोग कर रही है और इसे UTF-8 में परिवर्तित नहीं किया जा सकता है:

$ iconv -f ISO-8859 -t UTF-8 file
iconv: conversion from `ISO-8859' is not supported
Try `iconv --help' or `iconv --usage' for more information.
$ iconv  -t UTF-8 file
iconv: illegal input sequence at position 0
$ file file
file: ISO-8859 text

मेरा मुख्य प्रश्न यह है कि मैं odयहाँ के आउटपुट की व्याख्या कैसे कर सकता हूँ ? मैं इस पृष्ठ का उपयोग करने की कोशिश कर रहा हूं जो मुझे विभिन्न चरित्र अभ्यावेदन के बीच अनुवाद करने देता है, लेकिन यह मुझे बताता है कि 005353"हेक्स कोड पॉइंट" के रूप में, जो सही नहीं लगता है और 0aeb"हेक्स कोड पॉइंट" के रूप में, जो फिर से गलत लगता है ।

इसलिए, मैं तीन विकल्पों में से किसी का उपयोग कैसे कर सकता हूं ( या 355, ) यह पता लगाने के लिए कि वे किस चरित्र का प्रतिनिधित्व करने वाले हैं?0053530aeb

और हाँ, मैंने यूनिकोड टूल के साथ कोशिश की, लेकिन यह एक वैध UTF वर्ण प्रतीत नहीं होता है:

$ uniprops $(cat file)
U+FFFD ‹�› \N{REPLACEMENT CHARACTER}
    \pS \p{So}
    All Any Assigned Common Zyyy So S Gr_Base Grapheme_Base Graph X_POSIX_Graph
       GrBase Other_Symbol Print X_POSIX_Print Symbol Specials Unicode

अगर मैं यूनिकोड U + FFFD वर्ण का वर्णन समझता हूं, तो यह एक वास्तविक चरित्र नहीं है, बल्कि एक भ्रष्ट चरित्र के लिए एक प्लेसहोल्डर है। जो समझ में आता है क्योंकि फ़ाइल वास्तव में UTF-8 एन्कोडेड नहीं है।


5
ईबी कोड पेज 437 में या, कोड पेज 850 में δ , या 8859-1 में 8 हो सकता है ; उन में से कोई मतलब होगा? ( iconvशिकायत करता है क्योंकि आपने स्रोत वर्ण सेट निर्दिष्ट नहीं किया है, इसलिए यह आपके डिफ़ॉल्ट का उपयोग करता है जो संभवतः UTF-8 है।)
स्टीफन किट

@StephenKitt हाँ, ëजब डेटा को किसी अन्य प्रोग्राम पर उपयोग किया जाता है तो मैं क्या देखता हूँ! लेकिन मैं यह कैसे जान सकता हूं? क्या यह मेरे द्वारा प्रदत्त डेटा में कहीं नहीं है? तुम्हें यह कैसे मिला? ओह, मैंने कोशिश की थी iconv, -f ISO-8859लेकिन उसने शिकायत की कि conversion from ISO-8859 'समर्थित नहीं है'।
terdon

1
अरे! मैं देख रहा हूँ, मैं सिर्फ का उपयोग करने के लिए आवश्यक ebहै और उपेक्षा 0xहेक्स सूचक या जो कुछ भी करता है। इस तरह की मेरी अज्ञानता गहरी है। क्या आप यह उत्तर देते हुए बता सकते हैं कि @StephenKitt?
terdon

5
यहां आपकी महत्वपूर्ण गलती यह है कि ISO-8859 एन्कोडिंग का नाम नहीं है। यह एनकोडिंग का परिवार है; जाहिर है, आप जिस चीज की तलाश कर रहे हैं वह ISO-8859-1 है।
ट्रिपल

1
तब आपका iconvसफल होना तय था; और / या आप इसे विकिपीडिया पर उदाहरण के लिए देख सकते थे। इसके लिए बहुत विशिष्ट एन्कोडिंग, fileformat.info/info/unicode/char/00eb/index.htm भी काम करता है (यूनिकोड 128-255 रेंज में ISO-8859-1 के बराबर है, हालांकि बेशक कोई UTF एन्कोडिंग इसके साथ संगत नहीं है। )।
त्रिवेणी

जवाबों:


22

आपकी फ़ाइल में हेक्स में दो बाइट्स, EB और 0A शामिल हैं। यह संभावना है कि फ़ाइल एक चरित्र प्रति बाइट के साथ सेट का उपयोग कर रही है, जैसे कि ISO-8859-1 ; उस चरित्र सेट में, EB ë है:

$ printf "\353\n" | iconv -f ISO-8859-1
ë

अन्य उम्मीदवारों को कोड पेज 437 में 37, कोड पृष्ठ 850 में δ ...

od -xइस मामले में एंडियन की वजह से आउटपुट भ्रामक है; एक बेहतर विकल्प है -t x1जो सिंगल बाइट्स का उपयोग करता है:

$ printf "\353\n" | od -t x1
0000000 eb 0a
0000002

od -xनक्शे od -t x2जिसमें एक समय में दो बाइट्स पढ़ते हैं, और छोटे-एंडियन सिस्टम पर रिवर्स ऑर्डर में बाइट्स आउटपुट होते हैं।

जब आप इस तरह की फ़ाइल भर में आते हैं, जो मान्य UTF-8 मान्य नहीं है (या कोई मतलब नहीं है जब UTF-8 फ़ाइल के रूप में व्याख्या की जाती है), तो अपने एन्कोडिंग (और वर्ण सेट) को स्वचालित रूप से निर्धारित करने के लिए कोई मूर्ख-प्रूफ तरीका नहीं है। संदर्भ मदद कर सकता है: यदि यह पिछले कुछ दशकों में पश्चिमी पीसी पर निर्मित एक फ़ाइल है, तो आईएसओ-8859-1, -15 (यूरो संस्करण) या विंडोज -1252 में एन्कोडेड एक उचित मौका है; यदि यह उससे पुराना है, तो CP-437 और CP-850 संभावित उम्मीदवार हैं। पूर्वी यूरोपीय प्रणालियों, या रूसी प्रणालियों या एशियाई प्रणालियों की फाइलें, विभिन्न चरित्र सेटों का उपयोग करती हैं जिनके बारे में मुझे ज्यादा जानकारी नहीं है। फिर ईबीसीडीआईसी है ... iconv -lउन सभी चरित्र सेटों की सूची देगा जिनके iconvबारे में जानता है, और आप वहां से परीक्षण और त्रुटि के द्वारा आगे बढ़ सकते हैं।

(एक बिंदु पर मैं ज्यादातर सीपी -437 और एटीएएससीआई को दिल से जानता था, वे दिन थे।)


1
ठीक है, जिस विकिपीडिया पृष्ठ से आप लिंक करते हैं, मैं देख सकता हूं कि ëयह वर्णित है 00EBऔर 234। वे अतिरिक्त क्या हैं 00? और ऐसा क्यों नहीं है 355जैसा कि मुझे odआउटपुट से उम्मीद थी ? मैं इस बारे में अधिक सामान्य उत्तर प्राप्त करने की कोशिश कर रहा हूं कि मैं odचरित्र की पहचान करने के लिए आउटपुट का उपयोग कैसे कर सकता हूं । क्या आप शायद हेक्स कोड और / या किसी अज्ञात चरित्र की पहचान करने में सक्षम होने के लिए जानकारी की आवश्यकता के बारे में कुछ समझा सकते हैं (एन्कोडिंग और जो कुछ भी)?
terdon

EB ऑक्टल में 353 है (355 नहीं)। मैं सामान्यीकरण करने की कोशिश करूँगा ...
स्टीफन किट

वूप्स, सॉरी, मेरा मतलब था 353। तो 353 एक अष्टक निरूपण है, दशमलव नहीं। अरे।
terdon

1
हाँ, "ओ" का odअर्थ है अष्टदल ;-) में।
स्टीफन किट

1
किसी भी स्थिति में, (U + FFFD) टर्मिनल एमुलेटर द्वारा उस 0xeb बाइट के विकल्प के रूप में प्रदर्शित किया जाएगा जो UTF-8 में एक वैध चरित्र नहीं बनाता है। यह स्पष्ट नहीं है कि uniprops $(cat file)(क्यूटी गायब क्यों है ) रिपोर्ट करेगा कि (मुझे उस unipropsकमांड के बारे में पता नहीं है )। unicode "$(cat file)"डेबियन आउटपुट पर Sequence '\xeb' is not valid in charset 'UTF-8'जैसा कि मुझे उम्मीद थी।
स्टीफन चेज़लस

5

ध्यान दें कि odके लिए कम है अष्टाधारी डंप हां, तो 005353, अष्टाधारी शब्द के रूप में दो बाइट्स हैं od -xहै 0aebशब्द के रूप में हेक्साडेसिमल में, और अपनी फ़ाइल के वास्तविक सामग्री दो बाइट्स हैं ebऔर 0aहेक्साडेसिमल में, इसी क्रम में।

तो दोनों 005353और 0aebसिर्फ "हेक्स कोड बिंदु" के रूप में व्याख्या नहीं की जा सकती।

0aएक पंक्ति फ़ीड (LF) है, और ebआपके एन्कोडिंग पर निर्भर करता है। fileसिर्फ एन्कोडिंग का अनुमान लगा रहा है, यह कुछ भी हो सकता है। आगे कोई भी जानकारी के बिना फ़ाइल कहाँ से आई आदि यह पता लगाना मुश्किल होगा।


मुझे यह महसूस होता है क्योंकि मुझे समझ नहीं आता कि कोड पॉइंट (या हेक्स, वास्तव में) कैसे काम करते हैं, लेकिन मैं यह कैसे जान सकता हूँ? मैं आमतौर पर इसका उपयोग od -cकरता हूं क्योंकि आउटपुट मैं समझ सकता हूं। 355चरित्र का पता लगाने के लिए मैं कैसे इसका इस्तेमाल कर सकता था ? और 0aebइसकी जगह छपाई क्यों हो रही है eb0aअगर 0aनईलाइन है?
terdon

@terdon endianness ... मेरा अद्यतन उत्तर देखें।
स्टीफन किट

2

पाठ फ़ाइलों की चारसेट सटीकता के साथ अनुमान लगाना असंभव है।

चारडेट , फ़ायरफ़ॉक्स , फ़ाइल -आई जैसे उपकरण जब कोई स्पष्ट चारसेट जानकारी परिभाषित नहीं होती है (उदाहरण के लिए। यदि HTML में मेटा वर्णसेट = ... सिर में, चीजें आसान होती हैं) उन आंकड़ों का उपयोग करने की कोशिश करेंगे जो इतने बुरे नहीं हैं पाठ काफी बड़ा है।

निम्नलिखित में, मैं चारसेट-डिटेक्शन chardet( pip install chardet/ apt-get install python-chardetयदि आवश्यक हो) के साथ प्रदर्शित करता हूं ।

$ echo "in Noël" | iconv -f utf8 -t latin1  | chardet
<stdin>: windows-1252 with confidence 0.73

अच्छा चारसेट उम्मीदवार होने के बाद, हम उपयोग कर सकते हैं iconv, recodeया इसी तरह अपने "सक्रिय" चारसेट करने के लिए फ़ाइल चारसेट बदलने के लिए (मेरे मामले utf-8 में) तथा देखें कि इसे सही ढंग से अनुमान लगाया ...

iconv -f windows-1252  -t utf-8 file

कुछ चारसेट (जैसे iso-8859-3, iso-8859-1) में कई चार्ट सामान्य हैं - कभी-कभी यह देखना आसान नहीं होता है कि क्या हम सही charset पाए गए ...

इसलिए संबंधित पाठ (जैसे XML) से संबंधित मेटाडेटा होना बहुत महत्वपूर्ण है।


हम्म। मैं इसे यहाँ पुन: पेश नहीं कर सकता, यह बस दुर्घटनाग्रस्त हो गया। लेकिन किसी भी मामले में, बस मुझे फ़ाइल के एन्कोडिंग नहीं बता रहा है? मेरा मुद्दा चरित्र की पहचान कर रहा है फ़ाइल की एन्कोडिंग नहीं। जो मुझे पहले से पता था।
terdon

1
क्षमा करें, मैं इस प्रश्न को समझने में विफल रहा (मेरी सामान्य समस्या चारसेट की पहचान है)। यदि आप अब एन्कोडिंग, iconv -f ... -t utf-8 आप आकर्षण दिखाएगा?
जेजाओओ

नहीं, मैं सही एन्कोडिंग दिखाता हूँ। उस एन्कोडिंग द्वारा समर्थित एक विशेष चरित्र नहीं था और यह वह चरित्र है जिसे मैं पहचानने की कोशिश कर रहा था।
terdon

1
Iso-8859 एन्कोडिंग नहीं है! एन्कोडिंग है iso-8850-1। iso-8859 एक iso standart में कई परेशान परिभाषाएं शामिल हैं। कोशिशfile -i ...
JJoao

1
@terdon, जोर देने के लिए क्षमा करें, लेकिन, आपके द्वारा कोशिश की गई सभी चालें सही चारसेट के साथ काम करती हैं। Ex: iconv -f ISO-8859-1 -t UTF-8 file
जजॉओ

0
#!/bin/bash
#
# Search in a file, a known (part of a ) String (i.E.: Begrüßung),
# by testing all encodings
#
[[ $# -ne 2 ]] && echo "Usage: encoding-finder.sh FILE fUnKy_CHAR_FOR_SURE_IN_FILE" && exit
FILE=$1
PATTERN=$2
for enc in $( iconv -l | sed 's/..$//') 
do 
    iconv -f $enc -t UTF-8 $FILE  2>/dev/null | grep -m 1 $PATTERN && echo $enc 
done 

अगर मुझे एक फाइल मिलती है, जिसमें शब्द Begrung उदाहरण के लिए है, तो मैं अनुमान लगा सकता हूं कि Begrüßung का मतलब हो सकता है। इसलिए मैं इसे सभी ज्ञात एन्कोडिन्ग्स द्वारा परिवर्तित करता हूं और देखो, क्या कोई ऐसा पाया जाता है, जो इसे ठीक से परिवर्तित करता है।

आमतौर पर, कई एन्कोडिंग होते हैं जो फिट होते हैं।

लंबी फ़ाइलों के लिए, आप सैकड़ों पृष्ठों को बदलने के बजाय एक स्निपेट काट सकते हैं।

तो मैं इसे फोन करता

encodingfinder.sh FILE Begrüßung

और स्क्रिप्ट परीक्षण, चाहे वह ज्ञात एन्कोडिंग्स के साथ परिवर्तित करके, उनमें से कौन "बेगुरुंग" का उत्पादन करता है।

ऐसे पात्रों को खोजने के लिए, आमतौर पर मदद कम होती है, क्योंकि फंकी पात्र अक्सर बाहर खड़े होते हैं। संदर्भ से, खोज करने के लिए सही शब्द आमतौर पर अनुमान लगाया जा सकता है। लेकिन हम एक हेक्सेडिटर के साथ जांच नहीं करना चाहते हैं कि यह क्या है, और फिर अपने अपराधी को खोजने के लिए एन्कोडिंग के अंतहीन तालिकाओं पर जाएं। :)

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