একটি নমুনা কমান্ড যা লক্ষণটি প্রদর্শন করে: sed 's/./@/' <<<$'\xfc'
ব্যর্থ হয়, কারণ বাইটটি 0xfc
বৈধ ইউটিএফ -8 চর নয়।
নোট করুন, বিপরীতে, জিএনইউ sed
(লিনাক্স, তবে ম্যাকোএসে ইনস্টলযোগ্য) কেবল ত্রুটি না জানিয়েই অবৈধ বাইটটি পেরিয়ে যায়।
আপনার সত্যিকারের লোকেলের পক্ষে সমর্থন হারাতে আপত্তি না জানলে পূর্বের গৃহীত উত্তরটি ব্যবহার করা একটি বিকল্প (যদি আপনি কোনও মার্কিন সিস্টেমে থাকেন এবং আপনাকে কখনই বিদেশী চরিত্রগুলির সাথে ডিল করার প্রয়োজন হয় না, এটি ভাল হতে পারে।)
তবে, একই প্রভাবটি কেবলমাত্র একটি একক কমান্ডের জন্য অ্যাড-হক হতে পারে :
LC_ALL=C sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure
নোট: কি বিষয়ে একটি হল কার্যকর LC_CTYPE
সেটিং C
, তাই LC_CTYPE=C sed ...
হবে স্বাভাবিকভাবে এছাড়াও কাজ, কিন্তু যদি LC_ALL
(ব্যতীত অন্য কিছু সেট হতে হবে C
), এটা ব্যক্তির ওভাররাইড করবে LC_*
যেমন -category ভেরিয়েবল LC_CTYPE
। সুতরাং, সবচেয়ে দৃ approach় পদ্ধতির সেট করা হয় LC_ALL
।
তবে, (কার্যকরভাবে) সেটিংস LC_CTYPE
করতে C
একইরূপে স্ট্রিং যেন প্রতিটি বাইট ছিল তার নিজস্ব চরিত্র ( কোন ব্যাখ্যা এনকোডিং নিয়মগুলি উপর ভিত্তি সঞ্চালিত হয়), সঙ্গে কোন বিষয়ে জন্য - multibyte-অন-ডিমান্ড - UTF-8 এনকোডিং যে OS X এর ডিফল্ট ভাবে নিয়োগ সেখানে বিদেশী অক্ষর আছে multibyte এনকোডিং ।
সংক্ষেপে: সেটিং LC_CTYPE
করারC
কারণ শেল এবং ইউটিলিটি শুধুমাত্র অক্ষর মতো মৌলিক ইংরেজি অক্ষর (7-বিট হওয়া ASCII সীমার মধ্যে বেশী) চিনতে, যাতে বিদেশী অক্ষর। অক্ষর হিসাবে বিবেচনা করা হবে না , উদাহরণস্বরূপ, উপরের / ছোট হাতের রূপান্তর ব্যর্থ হয়।
যদি আপনি না প্রয়োজন আবার, এই জরিমানা হতে পারে মেলে যেমন multibyte এনকোডেড অক্ষর é
এবং নিছক করতে চান মাধ্যমে যেমন অক্ষর পাস ।
যদি এটি অপর্যাপ্ত এবং / অথবা আপনি মূল ত্রুটির কারণ বুঝতে চান (কোন ইনপুট বাইটগুলি কী কারণে সমস্যাটি নির্ধারণ করে) এবং চাহিদা অনুযায়ী এনকোডিং রূপান্তর সম্পাদন করে তবে নীচে পড়ুন।
সমস্যাটি হ'ল ইনপুট ফাইলের এনকোডিংটি শেলের সাথে মেলে না।
আরও সুনির্দিষ্টভাবে, ইনপুট ফাইলটিতে এমনভাবে এনকোড করা অক্ষর রয়েছে যা ইউটিএফ -8 এ বৈধ নয় (যেমন @ ক্লাস লিন্ডব্যাক একটি মন্তব্যে বলেছিলেন) - sed
ত্রুটি বার্তাটি এটি বলতে চেষ্টা করছে invalid byte sequence
।
সম্ভবত, আপনার ইনপুট ফাইলটিতে একটি ওয়েল -বাইট 8-বিট এনকোডিং যেমন ISO-8859-1
, "ওয়েস্টার্ন ইউরোপীয়" ভাষাগুলি এনকড করার জন্য প্রায়শই ব্যবহৃত হয় uses
উদাহরণ:
উচ্চারণযুক্ত চিঠিতে à
ইউনিকোড কোডপয়েন্ট 0xE0
(224) রয়েছে - যা একইভাবে রয়েছে ISO-8859-1
। তবে, ইউটিএফ -8 এনকোডিংয়ের প্রকৃতির কারণে , এই একক কোডপয়েন্টটি 2 বাইট হিসাবে উপস্থাপিত হয় - 0xC3 0xA0
যেখানে পাস করার চেষ্টা করা হচ্ছে একক বাইট 0xE0
হয় অবৈধ হল UTF-8 করেন।
এখানে একটি ব্যাপার সমস্যা বিক্ষোভের স্ট্রিং ব্যবহার করে voilà
যেমন এনকোড ISO-8859-1
সঙ্গেà
হিসাবে প্রতিনিধিত্ব এক (একটি ANSI-সি-উদ্ধৃত ব্যাশ স্ট্রিং (মাধ্যমে বাইট $'...'
) যে ব্যবহারসমূহ \x{e0}
বাইট তৈরি করতে):
নোট করুন যে sed
কমান্ডটি কার্যকরভাবে একটি অন-অপশন যা সহজেই ইনপুটটি পাস করে তবে আমাদের ত্রুটিটি উস্কে দেওয়ার প্রয়োজন:
# -> 'illegal byte sequence': byte 0xE0 is not a valid char.
sed 's/.*/&/' <<<$'voil\x{e0}'
কেবল সমস্যাটিকে উপেক্ষা করার জন্য , উপরেরLCTYPE=C
পদ্ধতির ব্যবহার করা যেতে পারে:
# No error, bytes are passed through ('á' will render as '?', though).
LC_CTYPE=C sed 's/.*/&/' <<<$'voil\x{e0}'
আপনি যদি নির্ধারণ করতে চান যে ইনপুটটির কোন অংশগুলি সমস্যা তৈরি করে , তবে নিম্নলিখিতগুলি চেষ্টা করুন:
# Convert bytes in the 8-bit range (high bit set) to hex. representation.
# -> 'voil\x{e0}'
iconv -f ASCII --byte-subst='\x{%02x}' <<<$'voil\x{e0}'
আউটপুট আপনাকে হেক্সাডেসিমাল আকারে উচ্চ বিট সেট (বাইটস যা--বিট এএসসিআইআই রেঞ্জ ছাড়িয়েছে) রয়েছে এমন সমস্ত বাইট দেখিয়ে দেবে। (দ্রষ্টব্য, তবে এটিতে সঠিকভাবে এনকোডযুক্ত ইউটিএফ -8 মাল্টিবাইট সিকোয়েন্সও রয়েছে - বিশেষত অবৈধ-ইন-ইউটিএফ -8 বাইট চিহ্নিত করার জন্য আরও পরিশীলিত পদ্ধতির প্রয়োজন হবে))
চাহিদার ভিত্তিতে এনকোডিং রূপান্তর সম্পাদন করা হচ্ছে :
স্ট্যান্ডার্ড ইউটিলিটি iconv
( -t
) এবং / অথবা থেকে রূপান্তর করতে ব্যবহার করা যেতে পারে-f
) এনকোডিংগুলিতে ; iconv -l
সমস্ত সমর্থিত তালিকাভুক্ত করে।
উদাহরণ:
উপরের উদাহরণের ISO-8859-1
উপর ভিত্তি করে শেল (ভিত্তিতে LC_CTYPE
, যা UTF-8
পূর্বনির্ধারিত রয়েছে) তে কার্যকর এনকোডিংয়ে FROM রূপান্তর করুন :
# Converts to UTF-8; output renders correctly as 'voilà'
sed 's/.*/&/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"
নোট করুন যে এই রূপান্তরটি আপনাকে বিদেশী চরিত্রগুলির সাথে সঠিকভাবে মেলে :
# Correctly matches 'à' and replaces it with 'ü': -> 'voilü'
sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"
ISO-8859-1
প্রসেসিংয়ের পরে ইনপুটটিকে BACK এ রূপান্তর করতে , কেবল ফলাফলটিকে অন্য iconv
কমান্ডে পাইপ করুন :
sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')" | iconv -t ISO-8859-1