(উচিত) LC_COLLATE অক্ষরের ব্যাপ্তিগুলিকে প্রভাবিত করে?


27

কোলেশন অর্ডার LC_COLLATEকেবল স্বতন্ত্র চরিত্রের ক্রমানুসারে নয়, চরিত্রের ব্যাপ্তির অর্থও সংজ্ঞায়িত করে। নাকি তা করে? নিম্নলিখিত স্নিপেট বিবেচনা করুন:

unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'

স্বজ্ঞাতভাবে, এতে Bনেই [a-z], সুতরাং এটি কোনও কিছুই আউটপুট করা উচিত নয়। উবুন্টু 8.04 বা 10.04 এ যা ঘটে। তবে কিছু মেশিনে ডিবিয়ান লেনি বা স্ক্রুগুলি চালিত Bপাওয়া যায়, কারণ এই পরিসীমাটির a-zমধ্যে aএবং zকোলেশন ক্রমের মধ্যে থাকা সমস্ত কিছুই অন্তর্ভুক্ত থাকে , যার Bমাধ্যমে মূলধনগুলিও অন্তর্ভুক্ত থাকে Z

পরীক্ষিত সমস্ত সিস্টেমে en_USলোকেল উত্পন্ন হয়। আমি লোকেলটি পৃথক করে দেখার চেষ্টাও করেছি: উপরে যে মেশিনগুলি Bমিলছে, সেখানে {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}জাপানিদের (যে কোনও উপলভ্য এনকোডিংয়ে) এবং C/ ব্যতীত প্রতিটি উপলভ্য লোকালে (বেশিরভাগ ল্যাটিন-ভিত্তিক: এছাড়াও চীনা স্থানীয়) মধ্যে একই ঘটনা ঘটে POSIX

আপনি যখন ASCII ছাড়িয়ে যান, তখন নিয়মিত ভাবের মধ্যে চরিত্রের ব্যাপ্তিগুলির অর্থ কী ? একদিকে কিছু দেবিয়ান ইনস্টলেশন এবং অন্যদিকে অন্যান্য দেবিয়ান ইনস্টলেশন এবং উবুন্টুর মধ্যে পার্থক্য কেন? অন্যান্য সিস্টেমগুলি কীভাবে আচরণ করে? কে সঠিক, এবং কার বিরুদ্ধে একটি বাগ রিপোর্ট করা উচিত?

(নোট যে আমি বিশেষভাবে চরিত্রের আচরণ সম্পর্কে জিজ্ঞেস করছি যেমন রেঞ্জ [a-z]মধ্যে en_USলোকেল, প্রাথমিকভাবে গনুহ libc ভিত্তিক সিস্টেমে। আমি ছোট হাতের অক্ষর বা হওয়া ASCII ছোট হাতের অক্ষর মেলে না জিজ্ঞেস করছি।)


দুই ডেবিয়ান মেশিন, এক যেখানে উপর Bরয়েছে [a-z]এবং এক যেখানে তা না হয়, আউটপুট LC_COLLATE=en_US locale -k LC_COLLATEহল

collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"

এবং এর আউটপুট LC_COLLATE=en_US.utf8 locale -k LC_COLLATEহয়

collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"

1
ডেবিয়ান লেনির যে উদাহরণটি আমি ব্যবহার করেছি তা পুনরুত্পাদন করে না। en_USযদিও জেনারেট হয়েছে কিনা তা পরীক্ষা করে দেখেনি।
অ্যালেক্স

1
@ অ্যালেক্স যদি লোকেলটি তৈরি না করা হয় তবে লোকেলটি ফ্যালব্যাক Cহিসাবে ব্যবহৃত হয় এবং এর কোলেশন ক্রমটি সোজা বাইট মান হয়, সুতরাং মিলবে Bনা। এর আউটপুটে প্রদর্শিত একটি লোকালে পরীক্ষা করুন locale -a
গিলস

1
মনে রাখবেন যে en_US en_US.utf8 এর সমান নয় এবং সাধারণত আপনি যা ইনস্টল করেছেন তার উপর নির্ভর করে en_US.iso-8859-1 হয়। যদি en_US (প্রত্যয়বিহীন) লোকেলের আউটপুটটিতে উপস্থিত না হয় - তবে আপনার কাছে এই স্থানীয় অবস্থানটি নেই। LC_COLLATE = en_US লোকেল-কে LC_COLLATE কী দেখায়?
নিল মেহেহে

1
এটি এর পরে এখানে তাত্ত্বিক প্রশ্নের চেয়ে বরং একটি ব্যবহারিক ক্ষেত্রে পরিণত হয়েছে: মূলধনপত্রগুলি কেন একটি অর্জিক রেজেক্সে নিম্ন-অক্ষরের অক্ষরে অন্তর্ভুক্ত করা হয়?
কালেব

1
@ আইসাক দুর্ভাগ্যক্রমে, 7 বছর পরে, আমি কোনও সমস্যাযুক্ত সিস্টেমে অ্যাক্সেস পেয়েছি বলে মনে হয় না। এগুলি সবই আপগ্রেড বা ডিকোমিশন করা হয়েছে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

উত্তর:


3

আপনি যদি Cলোকেল ব্যতীত অন্য কিছু ব্যবহার করে থাকেন তবে আপনার যেমন রেঞ্জগুলি ব্যবহার করা উচিত নয় [a-z]যেহেতু এগুলি লোকাল নির্ভর and পাশাপাশি ইতিমধ্যে আপনি যে কেস সমস্যার মুখোমুখি হয়ে গেছেন, তেমন কিছু লোকেল ডায়াক্রিটিক্সের সাথে অক্ষরগুলি ব্যবহার করে (উদাহরণস্বরূপ á ) বেস অক্ষর (যেমন )।

পরিবর্তে, একটি নামের চরিত্র শ্রেণি ব্যবহার করুন:

echo B | grep '[[:lower:]]'

এটি সর্বদা লোকালের জন্য সঠিক ফলাফল দেবে। যাইহোক, আপনার ইনপুট পাঠ্য এবং আপনি প্রয়োগ করার চেষ্টা করছেন এমন উভয়ের অর্থ প্রতিফলিত করার জন্য আপনাকে লোকেল চয়ন করতে হবে।

উদাহরণস্বরূপ, আপনার যদি কোনও নির্দিষ্ট বাইট মান সন্ধান করার প্রয়োজন হয় তবে Cলোকেলটি ব্যবহার করুন , যা সর্বদা পাওয়া যায়:

echo B | LANG=C grep '[a-z]'

যদি এটি প্রত্যাশার মতো কাজ না করে তবে এটি সত্যই একটি বাগ।


আমি জানি যে, আমি যা চেয়েছিলাম তা তা নয়। আমি স্পষ্টভাবে পরিসীমাটির অর্থ কী তা সম্পর্কে জিজ্ঞাসা করছি এবং কেন বিভিন্ন বিতরণ (এমনকি জিএনইউ লিবিসি এবং জিএনইউ গ্রেপ সহ) বিভিন্ন আচরণ রয়েছে। (উপাহিত কারণ আপনি যা বলছেন তা সঠিক হলেও এটি অপ্রাসঙ্গিক))
গিলস '

1
আমার বক্তব্যটি হ'ল একটি স্পষ্ট পরিসরের অর্থ লোকেল-নির্ভর, এবং বিভিন্ন সিস্টেমে তাদের লোকেলগুলি একইভাবে সংজ্ঞায়িত করার প্রয়োজন হয় না, সুতরাং এটি কোনও ত্রুটি নয়। প্রযুক্তিগতভাবে, আপনি সিস্টেমটিকে অপব্যবহার করছেন, সুতরাং "অপরিজ্ঞাত" আচরণ পেয়ে অবাক হওয়া উচিত নয়। এছাড়াও, বেশিরভাগ লোক মন্তব্য করেছেন যে তারা তাদের ডেবিয়ান সিস্টেমগুলিতে আচরণটি পুনরুত্পাদন করতে পারে না, সুতরাং আপনার সিস্টেম (গুলি) সম্পর্কে কিছু অস্বাভাবিক বলে মনে হচ্ছে।
নিল মেহেহে

1
আমি জানি যে সীমার আচরণ লোকালের উপর নির্ভর করে। আমি জিজ্ঞাসা করছি যে, এবং বিস্মিত হয়ে গেছে যে গ্লিবসি ব্যবহার করে বিভিন্ন সিস্টেমের (এবং এটি দেখা যাচ্ছে যে একই ডেবিয়ান রিলিজের এমনকি বিভিন্ন ইনস্টলেশন) বিভিন্ন আচরণ করে। আমি locale -kআমার প্রশ্নের আউটপুট যুক্ত করেছি ; এটি দুটি দেবিয়ান মেশিনে অভিন্ন, একটি যেখানে Bসীমার মধ্যে রয়েছে এবং একটি যেখানে এটি নেই। বিটিডাব্লু আমি কোনও মেশিনেই রুট নই (সুতরাং এটি অ্যাডমিন হিসাবে আমি যে অদ্ভুত কিছু করি না)।
গিলস

echo "Baü" | LC_COLLATE=C grep -o '[[:lower:]]'আয় aüযখন echo "Baü" | LC_COLLATE=C grep -o '[a-z]'আয় শুধুমাত্র a। আমার দৃষ্টিতে, "নিম্ন" আসলে ওপি যা চেয়েছিল তা নয়
ড্যানিয়েল অ্যাল্ডার

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

1

নিয়মিত অভিব্যক্তিগুলির ব্যাপ্তিগুলির কোলেশন সেটিংসটি পর্যবেক্ষণ করা উচিত। এখানে প্রাসঙ্গিক মানটি: http://pubs.opengroup.org/onlinepubs/007908799/xbd/re.html ("পরিসীমা এক্সপ্রেশন" সন্ধান করুন)। সুতরাং echo B | LC_COLLATE=en_US grep '[a-z]'আউটপুট Bস্ব স্ব স্থানীয় লোকের একটি বুদ্ধিমান সংজ্ঞা দেওয়া উচিত । এটি কেন কখনও কখনও আপনার জন্য কাজ করে না তা আমি ব্যাখ্যা করতে পারি না, তবে আমি সঠিকভাবে ইনস্টল করা এবং কনফিগার করা এমন কোনও প্রাচীন-প্রাচীন সিস্টেমে এটির মুখোমুখি হলে আমি খুব অবাক হব।


1
echo B | LC_COLLATE=en_US.utf8 grep '[a-z]' গ্রেপ 2.10 সহ উবুন্টু 12.04 এ কিছু মুদ্রণ করে না। গ্রেট ২.6.৩ সহ সেন্টোস .5.৫ এ কিছু মুদ্রণ করে না। গ্রেপ 2.6.3 এর সাথে ডেবিয়ান 6.0.8 এ কাজ করে।
ইয়ান ডি অ্যালেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.