ইউনিক্সের মতো সিস্টেমে C
মানটির জন্য কী করবে LC_ALL
?
আমি জানি যে এটি সমস্ত দিকের জন্য একই লোকেলকে বাধ্য করে কিন্তু কী করে C
?
ইউনিক্সের মতো সিস্টেমে C
মানটির জন্য কী করবে LC_ALL
?
আমি জানি যে এটি সমস্ত দিকের জন্য একই লোকেলকে বাধ্য করে কিন্তু কী করে C
?
উত্তর:
এটি আউটপুটটির জন্য অ্যাপ্লিকেশনগুলিকে ডিফল্ট ভাষা ব্যবহার করতে বাধ্য করে:
$ LC_ALL=es_ES man
¿Qué página de manual desea?
$ LC_ALL=C man
What manual page do you want?
এবং বাহ্য অনুসারে বাছাই করার বাহিনী:
$ LC_ALL=en_US sort <<< $'a\nb\nA\nB'
a
A
b
B
$ LC_ALL=C sort <<< $'a\nb\nA\nB'
A
B
a
b
LC_ALL
হ'ল পরিবেশ পরিবর্তনশীল যা অন্য সমস্ত স্থানীয়করণ সেটিংসকে ওভাররাইড করে ( কিছু পরিস্থিতিতে বাদে$LANGUAGE
)।
স্থানীয়করণের বিভিন্ন দিক (যেমন হাজার বিভাজক বা দশমিক পয়েন্ট চরিত্র, অক্ষর সেট, বাছাই ক্রম, মাস, দিনের নাম, ভাষা বা অ্যাপ্লিকেশন বার্তাগুলির মতো ত্রুটি বার্তা, মুদ্রার প্রতীক) কয়েকটি পরিবেশের ভেরিয়েবল ব্যবহার করে সেট করা যেতে পারে।
আপনি সাধারণত $LANG
আপনার পছন্দটিকে এমন একটি মান দিয়ে সেট করবেন যা আপনার অঞ্চলটিকে চিহ্নিত করে (যেমন fr_CH.UTF-8
আপনি যদি ফ্রেঞ্চ ভাষায় সুইজারল্যান্ডে থাকেন, ইউটিএফ -8 ব্যবহার করে)। পৃথক LC_xxx
ভেরিয়েবলগুলি একটি নির্দিষ্ট দিককে ওভাররাইড করে। LC_ALL
তাদের সকলকে ওভাররাইড করে। locale
কমান্ড, যখন যুক্তি ছাড়া নামক বর্তমান সেটিংস একটি সারসংক্ষেপ দেয়।
উদাহরণস্বরূপ, একটি জিএনইউ সিস্টেমে, আমি পাই:
$ locale
LANG=en_GB.UTF-8
LANGUAGE=
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=
উদাহরণস্বরূপ আমি একটি পৃথক সেটিংস ওভাররাইড করতে পারি:
$ LC_TIME=fr_FR.UTF-8 date
jeudi 22 août 2013, 10:41:30 (UTC+0100)
বা:
$ LC_MONETARY=fr_FR.UTF-8 locale currency_symbol
€
বা এলসি_এলএল দিয়ে সমস্ত কিছু ওভাররাইড করুন।
$ LC_ALL=C LANG=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8 cat /
cat: /: Is a directory
কোনও স্ক্রিপ্টে, আপনি যদি কোনও নির্দিষ্ট সেটিংটি জোর করতে চান, কারণ ব্যবহারকারীরা কী সেটিংস (সম্ভবত এলসি_এলএলও জোর করে) জোর করে তা জানেন না, আপনার সেরা, নিরাপদ এবং সাধারণভাবে কেবল বিকল্পটি এলসি_এলএলকে বাধ্য করা।
C
লোকেল একটি বিশেষ লোকেল যে সহজ লোকেল হতে বোঝানো হয়। আপনি আরও বলতে পারেন যে অন্যান্য লোকেলগুলি মানুষের জন্য, সি লোকেল কম্পিউটারের জন্য। সি লোকেলে, অক্ষরগুলি একক বাইট হয়, চরসেটটি ASCII হয় (ভাল, এটি প্রয়োজন হয় না তবে বাস্তবে আমাদের বেশিরভাগ সিস্টেমে ব্যবহার করতে হবে), বাছাই ক্রমটি বাইট মানগুলির উপর ভিত্তি করে, ভাষাটি সাধারণত মার্কিন ইংরেজী হয় (যদিও অ্যাপ্লিকেশন বার্তাগুলির জন্য (যেমন মাস বা দিনের নাম বা সিস্টেম লাইব্রেরি দ্বারা বার্তাগুলির বিপরীতে) এটি অ্যাপ্লিকেশন লেখকের বিবেচনার ভিত্তিতে) এবং মুদ্রার চিহ্নগুলির মতো জিনিসগুলি সংজ্ঞায়িত হয় না।
কিছু সিস্টেমে, পসিক্স লোকেলের সাথে পার্থক্য রয়েছে যেখানে উদাহরণস্বরূপ অ-এসসিআইআই অক্ষরগুলির জন্য বাছাই করার ক্রম সংজ্ঞায়িত করা হয়নি।
আপনার স্ক্রিপ্টে হস্তক্ষেপের জন্য ব্যবহারকারীর সেটিংস এড়াতে আপনি সাধারণত LC_ALL = C দিয়ে একটি কমান্ড চালান। উদাহরণস্বরূপ, যদি আপনি চান তাহলে [a-z]
থেকে 26 ASCII অক্ষর মেলে a
করার z
, আপনি সেট করতে LC_ALL=C
।
জিএনইউ সিস্টেমে LC_ALL=C
এবং LC_ALL=POSIX
(বা LC_MESSAGES=C|POSIX
) ওভাররাইড করা হবে $LANGUAGE
, যখন LC_ALL=anything-else
না।
কয়েকটি ক্ষেত্রে যেখানে আপনার সাধারণত সেট করতে হয় LC_ALL=C
:
sort -u
বা sort ... | uniq...
। সি ছাড়া অন্য অনেক লোকেলগুলিতে কিছু সিস্টেমে (উল্লেখযোগ্যভাবে জিএনইউ বেশী) কিছু অক্ষরের বাছাই ক্রম একই থাকে । sort -u
অনন্য লাইনগুলি প্রতিবেদন করে না, তবে প্রতিটি গ্রুপের লাইনের একটির মধ্যে সমান সাজানোর ক্রম রয়েছে। সুতরাং আপনি যদি অনন্য লাইন চান, আপনার একটি লোকেল প্রয়োজন যেখানে অক্ষরগুলি বাইট হয় এবং সমস্ত অক্ষরের বিভিন্ন বাছাই করার ক্রম থাকে (যা C
লোকেলের গ্যারান্টি দেয়)।=
এর অপারেটর POSIX অনুবর্তী expr
বা ==
POSIX অনুবর্তী এর অপারেটর awk
গুলি ( mawk
এবং gawk
যে বিষয়ে POSIX হয় না), যে চেক করবেন না কিনা দুটি স্ট্রিং অভিন্ন কিন্তু কিনা তারা একই সাজাতে।grep
। যদি আপনি ব্যবহারকারীর ভাষায় কোনও বর্ণের সাথে মেলে বোঝাতে চান তবে ব্যবহার করুন grep '[[:alpha:]]'
এবং সংশোধন করবেন না LC_ALL
। তবে আপনি যদি a-zA-Z
ASCII অক্ষরগুলির সাথে মিল রাখতে চান তবে আপনার প্রয়োজন হয় দুটি LC_ALL=C grep '[[:alpha:]]'
বা LC_ALL=C grep '[a-zA-Z]'
¹ ¹ [a-z]
এর a
আগে এবং তার আগে বাছাই করা অক্ষরগুলির সাথে মেলে z
(যদিও অনেকগুলি এপিআই এর সাথে এটি এর চেয়ে জটিল)। অন্যান্য লোকালে, আপনি সাধারণত জানেন না যে সেগুলি কী। উদাহরণস্বরূপ কিছু স্থানীয় লোকগুলি [a-z]
এপিআই-এর মতো কিছু এপিআইগুলিতে বাছাইয়ের ক্ষেত্রে কেসকে অগ্রাহ্য bash
করে [B-Z]
বা এতে অন্তর্ভুক্ত থাকতে পারে [A-Y]
। অনেক হল UTF-8 লোকেলে (তত্সহ en_US.UTF-8
সবচেয়ে সিস্টেমে), [a-z]
ল্যাটিন অক্ষর অন্তর্ভুক্ত করা হবে a
থেকে y
ডায়াক্রিটিক সহ কিন্তু না যারা z
(যেহেতুz
তাদের আগে ধরণের) যা আমি কল্পনা করতে পারি না আপনি যা চান তা হবে (কেন আপনি অন্তর্ভুক্ত করতে চান é
এবং না ź
কেন?)।ভাসমান পয়েন্ট গণিত মধ্যে ksh93
। ksh93
ভিতরে decimal_point
সেটিং সম্মান LC_NUMERIC
। আপনি যদি কোনও স্ক্রিপ্ট লিখে থাকেন তবে a=$((1.2/7))
এটি কোনও ব্যবহারকারী দ্বারা চালিত হলে কাজ করা বন্ধ করবে যার লোকালে দশমিক বিভাজক হিসাবে কমা রয়েছে:
$ ksh93 -c 'echo $((1.1/2))'
0.55
$ LANG=fr_FR.UTF-8 ksh93 -c 'echo $((1.1/2))'
ksh93: 1.1/2: arithmetic syntax error
তারপরে আপনার এমন জিনিসগুলির দরকার:
#! /bin/ksh93 -
float input="$1" # get it as input from the user in his locale
float output
arith() { typeset LC_ALL=C; (($@)); }
arith output=input/1.2 # use the dot here as it will be interpreted
# under LC_ALL=C
echo "$output" # output in the user's locale
পার্শ্ব দ্রষ্টব্য হিসাবে: ,
দশমিক বিভাজক ,
গাণিতিক অপারেটরের সাথে দ্বন্দ্ব যা আরও বিভ্রান্তির কারণ হতে পারে।
grep '<.*>'
, একটি যুক্ত লাইনগুলি সন্ধান করার জন্য <
, >
আপনি কোনও ইউটিএফ -8 লোকালে রয়েছেন এবং ইনপুটটি আইসো 8859-15 এর মতো একক-বাইট 8-বিট অক্ষর সেট করে এনকোড করা থাকলে কোনও কাজ করবে না। কারণ .
কেবলমাত্র অক্ষরগুলির সাথে মেলে এবং iso8859-15-এ অ-এসসিআইআই অক্ষরগুলি ইউটিএফ -8 এ বৈধ অক্ষর তৈরি না করার সম্ভাবনা রয়েছে। অন্যদিকে, LC_ALL=C grep '<.*>'
কাজ করবে কারণ কোনও বাইট মান লোকালে একটি বৈধ অক্ষর গঠন করে C
।যে কোনও সময় আপনি যখন ইনপুট ডেটা বা আউটপুট ডেটা প্রক্রিয়া করেন যা কোনও মানুষের জন্য / এর উদ্দেশ্যে নয়। আপনি যদি কোনও ব্যবহারকারীর সাথে কথা বলছেন তবে আপনি তাদের কনভেনশন এবং ভাষাটি ব্যবহার করতে চাইতে পারেন, তবে উদাহরণস্বরূপ, আপনি যদি এমন কিছু অ্যাপ্লিকেশন খাওয়ানোর জন্য কিছু নম্বর উত্পন্ন করেন যা ইংলিশ স্টাইলের দশমিক পয়েন্ট বা ইংরেজি মাসের নাম প্রত্যাশা করে, আপনি চাইবেন এলসি_এলএল = সি সেট করুন:
$ printf '%g\n' 1e-2
0,01
$ LC_ALL=C printf '%g\n' 1e-2
0.01
$ date +%b
août
$ LC_ALL=C date +%b
Aug
এটি কেস সংবেদনশীল তুলনা (যেমন পছন্দ করা grep -i
) এবং কেস রূপান্তর ( awk
এর toupper()
, dd conv=ucase
...) এর মতো জিনিসগুলিতেও প্রযোজ্য । এই ক্ষেত্রে:
grep -i i
I
ব্যবহারকারীর লোকালয়ে মিলতে গ্যারান্টিযুক্ত নয় । উদাহরণস্বরূপ কিছু তুর্কি স্থানীয় অবস্থানে এটি ওপরের ক্ষেত্রে i
যেমন İ
(বিন্দুটি নোট করুন) হয় না এবং লোয়ার-কেস I
হয় ı
(অনুপস্থিত বিন্দুকে নোট করুন)।
The পাঠ্যের এনকোডিংয়ের উপর নির্ভর করে, যদিও এটি করা সঠিকভাবে করা উচিত নয়। এটি ইউটিএফ -8 বা একক-বাইট অক্ষর সেটগুলির জন্য বৈধ (যেমন আইসো -8859-1), তবে অ-ইউটিএফ -8 মাল্টিবাইট অক্ষর সেটগুলি অগত্যা নয়।
উদাহরণস্বরূপ, আপনি যদি কোনও zh_HK.big5hkscs
লোকালে (হংকং, বিআইজি 5 চীনা বর্ণচিহ্ন এনকোডিংয়ের হংকং বৈকল্পিক ব্যবহার করে) থাকেন এবং আপনি এই অক্ষরটিতে এনকোডযুক্ত একটি ফাইলের মধ্যে ইংরেজী বর্ণগুলি সন্ধান করতে চান, যা হয়:
LC_ALL=C grep '[[:alpha:]]'
অথবা
LC_ALL=C grep '[a-zA-Z]'
কারণ যে অক্ষরসেট এ, ভুল হবে (এবং আরও অনেক কিছু, কিন্তু কষ্টসহকারে ব্যবহৃত যেহেতু হল UTF-8 বেরিয়ে আসেন), অক্ষরের একটি অনেক ধারণ বাইট যে ZA-z- র অক্ষরের হওয়া ASCII এনকোডিং মিলা। উদাহরণস্বরূপ, সমস্ত A䨝䰲丕乙乜你再劀劈呸哻唥唧噀噦嚳坽
(এবং আরও অনেক) এর এনকোডিং রয়েছে A
। 䨝
0x96 0x41, এবং A
ASCII এর মতো 0x41। সুতরাং আমাদের LC_ALL=C grep '[a-zA-Z]'
সেই লাইনগুলিতে মেলে যা এই অক্ষরগুলিকে ধারণ করে কারণ এটি বাইটগুলির সেই ক্রমগুলির ভুল ব্যাখ্যা করে।
LC_COLLATE=C grep '[A-Za-z]'
কাজ করবে, তবে LC_ALL
অন্যথায় সেট না করা থাকলে (যা ওভাররাইড হবে LC_COLLATE
)। সুতরাং আপনি করতে শেষ হতে পারে:
grep '[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]'
আপনি যদি লোকেলের এনকোডিং-এ এনকোড করা কোনও ফাইলের মধ্যে ইংরেজী বর্ণগুলি সন্ধান করতে চান।
C
লোকেল কেবলমাত্র "পোর্টেবল ক্যারেক্টার সেট" (এএসসিআইআই 0-127) সমর্থন করার জন্য প্রয়োজন, এবং চরগুলি> 127 এর জন্য আচরণ প্রযুক্তিগতভাবে অনির্দিষ্ট । অনুশীলনে, বেশিরভাগ প্রোগ্রামগুলি এগুলিকে অস্বচ্ছ ডেটা হিসাবে বিবেচনা করবে এবং আপনি বর্ণিত হিসাবে এগুলি পাস করবেন। তবে সব কিছু নয়: বিশেষত, লোকালে চলতে থাকলে রুবি বাইটগুলি> 127 এর সাথে চর ডেটাতে শ্বাসরোধ করতে পারে C
। আমি প্রযুক্তিগতভাবে এটি "উপযোগী" কিনা জানি না, তবে আমরা এটি বুনোতে দেখেছি ।
perl
s 'এর \x{7FFFFFFFFFFFFFFF}
) এবং যখন ইউনিকোড কোড পয়েন্ট পরিসীমা ইচ্ছামত U + এ 10FFFF সীমাবদ্ধ করা হয়েছে (ইউটিএফ -16 ডিজাইনের সীমাবদ্ধতার কারণে), কিছু সরঞ্জাম এখনও 6 বাইট অক্ষর সনাক্ত করে / উত্পাদন করে। এটি আমি 6 বাইট অক্ষর দ্বারা বোঝাতে চাইছি। ইউনিক্স শব্দার্থবিজ্ঞানে একটি চরিত্র একটি কোডপয়েন্ট। আপনার একাধিক কোডপয়েন্ট "অক্ষর" সাধারণত চরিত্রগুলি থেকে বিচ্ছিন্ন করতে গ্রাফেম ক্লাস্টার হিসাবে উল্লেখ করা হয়।
C
ডিফল্ট লোকেল, "পসিক্স" হ'ল "সি" এর উপাধি। আমার ধারণা "সি" এএনএসআই-সি থেকে প্রাপ্ত। হতে পারে এএনএসআই-সি "পসিক্স" লোকেলের সংজ্ঞা দেয়।
C
লোকেলের নামটি "এএনএসআই সি" থেকে এসেছে।
যতদূর আমি বলতে পারি, ওএস এক্স ইউটিএফ -8 লোকেলগুলিতে কোড পয়েন্ট কোলেশন অর্ডার ব্যবহার করে, সুতরাং এটি স্টাফেন চেজেলাসের উত্তরে উল্লিখিত কয়েকটি পয়েন্টের ব্যতিক্রম।
এটি ওএস এক্সে 26 এবং উবুন্টুতে 310 মুদ্রণ করে:
export LC_ALL=en_US.UTF-8
printf %b $(printf '\\U%08x\\n' $(seq $((0x11)) $((0x10ffff))))|grep -a '[a-z]'|wc -l
নীচের কোডটি ওএস এক্স-তে কিছুই প্রিন্ট করে না, ইঙ্গিত দেয় যে ইনপুটটি সাজানো হয়েছে। অপসারণ করা ছয়টি সারোগেট অক্ষর একটি অবৈধ বাইট সিকোয়েন্স ত্রুটির কারণ ঘটায়।
export LC_ALL=en_US.UTF-8
for ((i=1;i<=0x1fffff;i++));do
x=$(printf %04x $i)
[[ $x = @(000a|d800|db7f|db80|dbff|dc00|dfff) ]]&&continue
printf %b \\U$x\\n
done|sort -c
নীচের কোডটি ওএস এক্স-তে কোনও কিছুই মুদ্রণ করে না, এটি নির্দেশ করে যে কোনও দুটি টানা কোড পয়েন্ট নেই (কমপক্ষে ইউ + 000 বি এবং ইউ + ডি 7 এফএফ এর মধ্যে) একই সমান্তরাল ক্রম রয়েছে।
export LC_ALL=en_US.UTF-8
for ((i=0xb;i<=0xd7fe;i++));do
printf %b $(printf '\\U%08x\\n' $((i+1)) $i)|sort -c 2>/dev/null&&echo $i
done
(উপরের উদাহরণগুলি ব্যবহার করুন %b
কারণ printf \\U25
zsh এ ত্রুটি হয়)
জিএনইউ সিস্টেমে একই রকম কোলাকশন ক্রমযুক্ত কিছু অক্ষর এবং বর্ণগুলির ক্রমগুলির ওএস এক্সে সমান কোলাকেশন ক্রম নেই This এটি প্রিন্ট করে OS ওএস এক্সের প্রথম (ওএস এক্স sort
বা জিএনইউ ব্যবহার করে sort
) তবে উবুন্টুতে প্রথম:
export LC_ALL=en_US.UTF-8;printf %s\\n ② ①|sort
এটি ওএস এক্সে তিনটি লাইন মুদ্রণ করে (ওএস এক্স sort
বা জিএনইউ ব্যবহার করে sort
) তবে উবুন্টুতে একটি লাইন:
export LC_ALL=en_US.UTF-8;printf %b\\n \\u0d4c \\u0d57 \\u0d46\\u0d57|sort -u
এটি প্রদর্শিত হয় যে LC_COLLATE
ls এর পাশাপাশি ব্যবহৃত "বর্ণমালার ক্রম "ও নিয়ন্ত্রণ করে। মার্কিন লোকেল নিম্নরূপে বাছাই করবে:
a.C
aFilename.C
aFilename.H
a.H
মূলত পিরিয়ড উপেক্ষা করা। আপনি পছন্দ করতে পারেন:
a.C
a.H
aFilename.C
aFilename.H
আমি অবশ্যই করি। LC_COLLATE
এটি C
সম্পাদন করা সেট । নোট করুন যে এটি সমস্ত বড় বড় রাজধানীর পরে ছোট কেসটিকেও সাজিয়ে রাখবে:
A.C
A.H
AFilename.C
a.C
a.H
xclock
সতর্কবাণী (Missing charsets in String to FontSet conversion
) দিয়ে কোনও সমস্যার সমাধান করতে চান তবেLC_ALL=C.UTF-8
সিরিলিকের সমস্যা এড়াতে আপনি যদি এটি ব্যবহার করেন তবে ভাল । এই পরিবেশের পরিবর্তনশীলটি সেট করতে আপনাকে অবশ্যই~/.bashrc
ফাইলের শেষে নিম্নলিখিত লাইনটি যুক্ত করতে হবে -export LC_ALL=C.UTF-8