আমি কীভাবে একটি অদ্ভুত চরিত্রটি সনাক্ত করতে পারি?


10

আমি যে ফাইলটি নিয়ে কাজ করছি তার মধ্যে একটি অদ্ভুত চরিত্রটি সনাক্ত করার চেষ্টা করছি:

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

ফাইলটি আইএসও -8859 এনকোডিং ব্যবহার করছে এবং ইউটিএফ -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, 005353বা 0aeb) খুঁজে বের করতে কি চরিত্র তারা প্রতিনিধিত্ব অনুমিত হয়?

এবং হ্যাঁ, আমি ইউনিকোড সরঞ্জাম দিয়ে চেষ্টা করেছি তবে এটি কোনও বৈধ ইউটিএফ চরিত্র বলে মনে হয় না:

$ 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

যদি আমি ইউনিকোড ইউ + এফএফএফডি চরিত্রের বর্ণনাটি বুঝতে পারি তবে এটি কোনও দুর্ভাগ্যযুক্ত চরিত্রের স্থানধারক ছাড়া মোটেই বাস্তব চরিত্র নয়। ফাইলটি যেহেতু ইউটিএফ -8 এনকোডড নয় সেহেতু এটি বোঝা যায়।


5
ইবি কোড পৃষ্ঠাতে 437 or, বা কোড পৃষ্ঠা 850 Ù , বা 8859-1 এ ë হতে পারে ; তাদের কেউ বোঝাতে পারে? ( iconvঅভিযোগ করেছেন কারণ আপনি উত্স অক্ষর সেটটি নির্দিষ্ট করেন নি, তাই এটি আপনার ডিফল্ট ব্যবহার করে যা সম্ভবত ইউটিএফ -8 রয়েছে।)
স্টিফেন কিট

@ স্টেফেনকিট হ্যাঁ, ëডেটা অন্য প্রোগ্রামে ব্যবহার করা হয় তখন আমি কী দেখি! তবে আমি কীভাবে এটি জানতে পারি? আমি যে ডেটা সরবরাহ করি তা কোথাও না? কিভাবে তুমি এটা খুজে পেলে? ওহ আমি চেষ্টা করেছিলেন iconvসঙ্গে -f ISO-8859কিন্তু এটি অভিযোগ conversion from আইএসও-8859 'supported` করা হয় না।
terdon

1
আহা! আমি দেখতে পাচ্ছি, আমাকে ন্যায়সঙ্গত ব্যবহার ebএবং 0xহেক্স সূচক বা যা কিছু তা উপেক্ষা করার দরকার ছিল । এই ধরণের জিনিস সম্পর্কে আমার অজ্ঞতা গভীর। আপনি কি এমন একটি পোস্ট পোস্ট করতে পারবেন যাতে ব্যাখ্যা করে @ স্টেফেনকিট?
terdon

5
এখানে আপনার গুরুত্বপূর্ণ ভুলটি হল ISO-8859 কোনও এনকোডিংয়ের নাম নয়। এটি এনকোডিংয়ের একটি পরিবার; স্পষ্টতই, আপনি যেটির সন্ধান করছেন তা হ'ল আইএসও -8859-1।
ট্রিপলি

1
তাহলে তোমার iconvসাফল্য হত; এবং / অথবা আপনি এটি উইকিপিডিয়ায় যেমন সন্ধান করতে পারতেন। এই খুব নির্দিষ্ট এনকোডিংয়ের জন্য, fileformat.info/info/unicode/char/00eb/index.htm এছাড়াও কাজ করে (ইউনিকোড 128-255 রেঞ্জের আইএসও -8859-1 এর সমতুল্য, যদিও কোনও ইউটিএফ এনকোডিং এর সাথে সামঞ্জস্যপূর্ণ নয়) )।
ট্রিপলি

উত্তর:


22

আপনার ফাইলটিতে হেক্সে দুটি বাইট, EB এবং 0A রয়েছে। সম্ভবত ফাইলটি অক্ষর প্রতি বাইট সহ একটি অক্ষর সেট ব্যবহার করছে, যেমন আইএসও -8859-1 ; চরিত্রের সেটটিতে, EB হ'ল:

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

অন্যান্য প্রার্থীরা কোড পৃষ্ঠাতে 437 , কোড পৃষ্ঠা 850 তে থাকবেন ...

od -xএর পরিণতি এ ক্ষেত্রে পরিণাম বিভ্রান্ত করছে; একটি ভাল বিকল্প -t x1যা একক বাইট ব্যবহার করে:

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

od -xমানচিত্র od -t x2যা একবারে দুটি বাইট পড়ে এবং লিটল-এন্ডিয়ান সিস্টেমে বাইটগুলি বিপরীত ক্রমে আউটপুট করে।

আপনি যখন এই জাতীয় কোনও ফাইল জুড়ে আসেন, যা ইউটিএফ -8 বৈধ নয় (বা ইউটিএফ -8 ফাইল হিসাবে ব্যাখ্যা করার সময় কোনও অর্থবোধ করে না), স্বয়ংক্রিয়ভাবে এর এনকোডিং (এবং চরিত্রের সেট) নির্ধারণ করার কোনও বোকা-প্রমাণ উপায় নেই। প্রসঙ্গটি সহায়তা করতে পারে: এটি যদি গত কয়েক দশক ধরে কোনও পশ্চিমা পিসিতে উত্পাদিত কোনও ফাইল হয় তবে আইএসও -8859-1, -15 (ইউরো রূপ) বা উইন্ডোজ-1252 এ এনকোডেড থাকার উপযুক্ত সুযোগ রয়েছে; যদি এটি এর চেয়ে পুরানো হয় তবে সিপি -৩77 এবং সিপি-8৫০ সম্ভাব্য প্রার্থী। পূর্ব ইউরোপীয় সিস্টেমগুলি, বা রাশিয়ান সিস্টেমগুলি, বা এশিয়ান সিস্টেমগুলি থেকে আসা ফাইলগুলি বিভিন্ন চরিত্রের সেট ব্যবহার করবে যা সম্পর্কে আমি খুব বেশি জানি না। তারপরে EBCDIC রয়েছে ... এমন iconv -lসমস্ত চরিত্রের সেটগুলি তালিকাভুক্ত করবে যা iconvসম্পর্কে জানে এবং আপনি সেখান থেকে ট্রায়াল এবং ত্রুটি করে এগিয়ে যেতে পারেন।

(এক পর্যায়ে আমি বেশিরভাগ সিপি -৩77 এবং এটিএসসিআইআই-কে হৃদয় দিয়ে জানতাম, সেদিন ছিল))


1
ঠিক আছে, উইকিপিডিয়া আপনি যে পৃষ্ঠাটি এর প্রতি সংযোগ আছে, আমার দেখতে পারেন ëহিসেবে অভিহিত করা হয় 00EBএবং 234। Extra অতিরিক্ত 00কি? এবং কেন 355আমি odআউটপুট থেকে প্রত্যাশিত হিসাবে না ? আমি কীভাবে odঅক্ষর সনাক্ত করতে আউটপুটটি ব্যবহার করতে পারি সে সম্পর্কে আরও সাধারণ উত্তর পাওয়ার চেষ্টা করছি । আপনি সম্ভবত হেক্স কোড এবং / অথবা কোন অজানা অক্ষর (এনকোডিং এবং অন্য কিছু) সনাক্ত করতে সক্ষম হওয়ার জন্য কোন তথ্যের প্রয়োজন তা ব্যাখ্যা করার বিষয়ে কিছু ব্যাখ্যা করতে পারেন?
terdon

অক্টোবরে ইবি 353 (355 নয়)। আমি সাধারণ করার চেষ্টা করব ...
স্টিফেন কিট

ওফস, দুঃখিত, আমি বলতে চাইছিলাম 353। সুতরাং 353 হ'ল একটি অষ্টাল প্রতিনিধিত্ব, দশমিক নয়। আহা।
terdon

1
হ্যাঁ, "ও" এর odঅর্থ অষ্টাল ;-)।
স্টিফেন কিট

1
যে কোনও ক্ষেত্রে, (ইউ + এফএফএফডি) টার্মিনাল এমুলেটর দ্বারা 0xeb বাইটের বিকল্প হিসাবে প্রদর্শিত হবে যা ইউটিএফ -8 এ কোনও বৈধ অক্ষর তৈরি করে না। এটি কেন পরিষ্কার নয় uniprops $(cat file)(বিটিডব্লু অনুপস্থিত) কেন রিপোর্ট করবে (আমি সেই unipropsআদেশের বিষয়ে জানি না )। আমি আশা করি হিসাবে unicode "$(cat file)"দেবিয়ান আউটপুট দেয় does Sequence '\xeb' is not valid in charset 'UTF-8'
স্টাফেন চেজেলাস

5

লক্ষ্য করুন od-এর সংক্ষিপ্ত রূপ অকট্যাল ডাম্প তাই হয়, 005353, অকট্যাল শব্দ দুটি বাইট হয় od -xহয় 0aebশব্দ হিসাবে হেক্সাডেসিমেল, এবং আপনার ফাইল প্রকৃত বিষয়বস্তু দুই বাইট হয় ebএবং 0aহেক্সাডেসিমেল, এই যাতে।

সুতরাং উভয় 005353এবং 0aebকেবল "হেক্স কোড পয়েন্ট" হিসাবে ব্যাখ্যা করা যায় না।

0aএকটি লাইন ফিড (এলএফ), এবং ebআপনার এনকোডিংয়ের উপর নির্ভর করে। fileশুধু এনকোডিং অনুমান করা হয়, এটি কিছু হতে পারে। ফাইল কোথা থেকে এসেছে সে সম্পর্কে আরও কোনও তথ্য না থাকলে এটি খুঁজে পাওয়া শক্ত হবে।


আমি বুঝতে পেরেছি কারণ এটি কোড পয়েন্ট (বা হেক্স, সত্যই) কীভাবে কাজ করে তা আমি বুঝতে পারি না তবে আমি কীভাবে এটি জানতে পারি? আমি সাধারণত ব্যবহার করি od -cযেহেতু আমি বুঝতে পারি আউটপুট উত্পাদন করে। 355চরিত্রটি সনাক্ত করতে আমি যে উত্পাদন করে তা কীভাবে ব্যবহার করতে পারি ? আর কেনই বা এটা মুদ্রণ করা হয় 0aebপরিবর্তে eb0aযদি 0aসম্পর্কে newline হয়?
terdon

@terdon endianness ... আমার আপডেট উত্তর দেখুন।
স্টিফেন কিট

2

পাঠ্য ফাইলের চারসেটের 100% নির্ভুলতার সাথে অনুমান করা অসম্ভব।

চার্ডেট , ফায়ারফক্স , ফাইল -i এর মতো সরঞ্জামগুলি যখন কোনও স্পষ্ট চরসেটের তথ্য সংজ্ঞায়িত না করা হয় (উদাহরণস্বরূপ যদি এইচটিএমএলে একটি মেটা চরসেট থাকে = মাথায়, জিনিসগুলি সহজ হয়) তবে হিউরিস্টিক্স ব্যবহার করার চেষ্টা করবে যা এতটা খারাপ নয় যদি পাঠ্যটি যথেষ্ট বড়।

নিম্নলিখিতটিতে, আমি 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

কিছু চরসেট (যেমন আইসো -8859-3, আইসো -8859-1) এর প্রচুর অক্ষর প্রচলিত রয়েছে - কখনও কখনও আমরা নিখুঁত অক্ষরটি খুঁজে পেলাম কিনা তা সহজে দেখা যায় না ...

সুতরাং প্রাসঙ্গিক পাঠ্যের সাথে মেটাডেটা যুক্ত হওয়া খুব গুরুত্বপূর্ণ (যেমন এক্সএমএল)।


হুম। আমি এখানে এটি পুনরুত্পাদন করতে পারি না, এটি কেবল ক্র্যাশ হয়ে গেছে। তবে যে কোনও ক্ষেত্রে, কেবল ফাইলটির এনকোডিংটি আমাকে বলছে না? আমার সমস্যাটি ফাইলের এনকোডিং নয় চরিত্রটি সনাক্ত করছে । যা আমি আগেই জানতাম।
terdon

1
দুঃখিত, আমি প্রশ্নটি বুঝতে ব্যর্থ হয়েছি (আমার স্বাভাবিক সমস্যাটি চরসেট শনাক্তকরণ)। আপনি যদি এখন এনকোডিং করেন তবে আপনাকে iconv -f ... -t utf-8 চরগুলি দেখাবে?
জাজাও

না। আমি ঠিক সেখানে এনকোডিং দেখাব। সেই এনকোডিং দ্বারা সমর্থিত একটি নির্দিষ্ট অক্ষর ছিল এবং এটি সেই চরিত্রটি যা আমি সনাক্ত করার চেষ্টা করছিলাম।
terdon

1
আইসো -8859 এনকোডিং নয়! এনকোডিং হয় iso-8850-1। আইসো -8859 একটি আইসো স্ট্যান্ডআর্ট যার মধ্যে বেশ কয়েকটি শিষ্ট সংজ্ঞা রয়েছে। চেষ্টা করুনfile -i ...
জাজাও

1
@ ইটারডন, জোর করে দুঃখিত, তবে, আপনি যে সমস্ত কৌশলটি সঠিক চরসেট দিয়ে কাজ করার চেষ্টা করেছেন উদা: 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 

আমি যদি একটি ফাইল পাই, যার মধ্যে শব্দ দ্য বেগেরং ইনস্ট্যান্সের জন্য থাকে তবে আমি অনুমান করতে পারি যে বেগেরুঙকে বোঝানো হতে পারে। সুতরাং আমি এটিকে সমস্ত পরিচিত এনকোডিন্ড দ্বারা রূপান্তর করি এবং দেখি যে কোনওটি পাওয়া যায় কিনা, যা এটিকে সঠিকভাবে রূপান্তর করে।

সাধারণত, একাধিক এনকোডিং রয়েছে যা ফিট বলে মনে হচ্ছে।

দীর্ঘতর ফাইলের জন্য, আপনি কয়েকশ পৃষ্ঠাতে রূপান্তর না করে একটি স্নিপেট কাটতে পারেন।

সুতরাং আমি এটি কল হবে

encodingfinder.sh FILE Begrüßung

এবং স্ক্রিপ্ট পরীক্ষা করে এটি পরিচিত এনকোডিংগুলিতে রূপান্তর করে কিনা, এর মধ্যে কোনটি "বেগেরুং" উত্পাদন করে।

এই জাতীয় অক্ষরগুলি খুঁজতে, সাধারণত কমই সাহায্য করা হয়, কারণ ফানকি চরিত্রগুলি প্রায়শই বাইরে থাকে। প্রসঙ্গ থেকে, অনুসন্ধান করার জন্য সঠিক শব্দটি সাধারণত অনুমান করা যায়। তবে আমরা কোনও হেক্সিডিটারের সাথে এটি পরীক্ষা করতে চাই না, এটি কী বাইট হয় এবং তারপরে আমাদের অপরাধী সন্ধানের জন্য এনকোডিংয়ের অন্তহীন টেবিলগুলিতে যান। :)

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