වෙන්නේ මොනවාද C
වටිනාකමක් LC_ALL
යුනික්ස් වැනි පද්ධති ද?
එය සෑම අංශයක් සඳහාම එකම පෙදෙසකට බල කරන බව මම දනිමි නමුත් කුමක් කරන්නේද C
?
වෙන්නේ මොනවාද C
වටිනාකමක් LC_ALL
යුනික්ස් වැනි පද්ධති ද?
එය සෑම අංශයක් සඳහාම එකම පෙදෙසකට බල කරන බව මම දනිමි නමුත් කුමක් කරන්නේද C
?
Answers:
ප්රතිදානය සඳහා පෙරනිමි භාෂාව භාවිතා කිරීමට එය යෙදුම් වලට බල කරයි:
$ 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
තර්කය තොරව හඳුන්වන විට විධානය, වත්මන් සැකසුම් සාරාංශයක් ලබා දෙයි.
උදාහරණයක් ලෙස, GNU පද්ධතියක, මට ලැබෙන්නේ:
$ 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 සමඟ සියල්ල අභිබවා යන්න.
$ LC_ALL=C LANG=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8 cat /
cat: /: Is a directory
ස්ක්රිප්ට් එකක, ඔබට නිශ්චිත සැකසුමක් බල කිරීමට අවශ්ය නම්, පරිශීලකයා බල කර ඇත්තේ කුමන සැකසුම් දැයි ඔබ නොදන්නා බැවින් (සමහර විට LC_ALL ද විය හැකිය), ඔබේ හොඳම, ආරක්ෂිත සහ සාමාන්යයෙන් එකම විකල්පය වන්නේ LC_ALL බල කිරීමයි.
මෙම C
පෙදෙසි සරලතම පෙදෙසි විය අදහස් කරන බව විශේෂ පෙදෙසි වේ. අනෙක් ස්ථාන මිනිසුන් සඳහා වන අතර සී පෙදෙස පරිගණක සඳහා යැයි ඔබට පැවසිය හැකිය. සී පෙදෙසෙහි, අක්ෂර තනි බයිට් වේ, අක්ෂර කට්ටලය ASCII වේ (හොඳයි, අවශ්ය නොවේ, නමුත් ප්රායෝගිකව අපගෙන් බොහෝ දෙනෙකුට කවදා හෝ භාවිතා කිරීමට හැකි පද්ධති වල පවතිනු ඇත), වර්ග කිරීමේ අනුපිළිවෙල පදනම් වන්නේ බයිට් අගයන් මත ය, භාෂාව සාමාන්යයෙන් එක්සත් ජනපද ඉංග්රීසි වේ (යෙදුම් පණිවිඩ සඳහා (මාස හෝ දින නම් හෝ පද්ධති පුස්තකාලවල පණිවිඩ වැනි), එය යෙදුම් කතෘගේ අභිමතය පරිදි වේ) සහ මුදල් සංකේත වැනි දේ අර්ථ දක්වා නැත.
සමහර පද්ධති වල, POSIX පෙදෙස සමඟ වෙනසක් ඇත, උදාහරණයක් ලෙස ASCII නොවන අක්ෂර සඳහා වර්ග කිරීමේ අනුපිළිවෙල අර්ථ දක්වා නොමැත.
ඔබේ ස්ක්රිප්ටයට බාධා කිරීම සඳහා පරිශීලකයාගේ සැකසුම් වලක්වා ගැනීම සඳහා ඔබ සාමාන්යයෙන් LC_ALL = C සමඟ විධානයක් ක්රියාත්මක කරයි. උදාහරණයක් ලෙස, ඔබට අවශ්ය නම්, [a-z]
සිට 26 ASCII අක්ෂර ගැලපෙන a
කිරීමට z
, ඔබට කැප කිරීමට සිදු LC_ALL=C
.
GNU පද්ධති වල, LC_ALL=C
සහ LC_ALL=POSIX
(හෝ LC_MESSAGES=C|POSIX
) අභිබවා $LANGUAGE
යන අතර, LC_ALL=anything-else
එසේ නොවේ.
ඔබ සාමාන්යයෙන් සැකසිය යුතු අවස්ථා කිහිපයක් LC_ALL=C
:
sort -u
හෝ sort ... | uniq...
. C හැර වෙනත් බොහෝ ස්ථානවල, සමහර පද්ධතිවල (විශේෂයෙන් GNU ඒවා), සමහර අක්ෂරවල එකම වර්ග කිරීමේ අනුපිළිවෙලක් ඇත. sort -u
අද්විතීය රේඛා වාර්තා නොකරයි, නමුත් සමාන වර්ග කිරීමේ අනුපිළිවෙලක් ඇති එක් එක් පේළි සමූහයෙන් එකකි. එබැවින් ඔබට අද්විතීය රේඛා අවශ්ය නම්, ඔබට අක්ෂර බයිට් සහ සියලුම අක්ෂර එකිනෙකට වෙනස් වර්ග කිරීමේ අනුපිළිවෙලක් ඇති ( C
පෙදෙසි සහතික කරන) ස්ථානයක් අවශ්ය වේ.=
POSIX අනුකූලතාවයේ ක්රියාකරුට expr
හෝ POSIX අනුකූලතා ක්රියාකරුටද මෙය අදාළ වේ ( සහ ඒ සම්බන්ධයෙන් POSIX නොවේ), එමඟින් නූල් දෙකක් සමානද, නමුත් ඒවා එක හා සමානද යන්න පරීක්ෂා නොකරයි.==
awk
mawk
gawk
grep
. පරිශීලකයාගේ භාෂාවෙන් අකුරක් ගැලපීමට ඔබ අදහස් කරන්නේ නම්, භාවිතා කරන්න grep '[[:alpha:]]'
සහ වෙනස් නොකරන්න LC_ALL
. නමුත් ඔබට a-zA-Z
ASCII අක්ෂර ගැලපීමට අවශ්ය නම්, ඔබට හෝ LC_ALL=C grep '[[:alpha:]]'
or අවශ්ය වේ LC_ALL=C grep '[a-zA-Z]'
. [a-z]
පසු a
හා පෙර වර්ග කරන අක්ෂර සමඟ ගැලපේ z
(බොහෝ API සමඟ එය ඊට වඩා සංකීර්ණ වුවද). වෙනත් ස්ථාන වල, ඔබ සාමාන්යයෙන් ඒවා මොනවාදැයි නොදනී. උදාහරණයක් ලෙස සමහර ස්ථාන එසේ වර්ගීකරණයේ නඩුව නොසලකා [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 '<.*>'
a අඩංගු රේඛා සෙවීම සඳහා <
, >
ඔබ UTF-8 පෙදෙසක සිටී නම් යුගලය ක්රියා නොකරනු ඇති අතර ආදානය iso8859-15 වැනි තනි-බයිට් 8-බිට් අක්ෂර කට්ටලයක් තුළ කේතනය කර ඇත. එයට හේතුව .
iso8859-15 හි ගැලපෙන අක්ෂර සහ ASCII නොවන අක්ෂර පමණක් UTF-8 හි වලංගු අක්ෂරයක් සෑදීමට නොහැකි වීමයි. අනෙක් අතට, LC_ALL=C grep '<.*>'
ඕනෑම බයිට් අගයක් පෙදෙසෙහි වලංගු අක්ෂරයක් C
සාදන බැවින් එය ක්රියා කරයි.ඔබ මිනිසෙකුගෙන් / අපේක්ෂා නොකරන ආදාන දත්ත හෝ ප්රතිදාන දත්ත සැකසෙන ඕනෑම වේලාවක. ඔබ පරිශීලකයෙකු සමඟ කතා කරන්නේ නම්, ඔබට ඔවුන්ගේ සම්මුතිය සහ භාෂාව භාවිතා කිරීමට අවශ්ය විය හැකිය, නමුත් නිදසුනක් ලෙස, ඉංග්රීසි විලාසිතාවේ දශම ලකුණු හෝ ඉංග්රීසි මාස නාමයන් අපේක්ෂා කරන වෙනත් යෙදුමක් පෝෂණය කිරීම සඳහා ඔබ යම් සංඛ්යා උත්පාදනය කරන්නේ නම්, ඔබට අවශ්ය වනු ඇත LC_ALL = 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 පෙළ කේතනය කිරීම මත පදනම්ව, එය කළ යුතු නිවැරදි දෙය නොවේ. එය UTF-8 හෝ තනි-බයිට් අක්ෂර කට්ටල සඳහා (iso-8859-1 වැනි) වලංගු වේ, නමුත් අවශ්යයෙන්ම UTF-8 නොවන බහු බයිට් අක්ෂර කට්ටල සඳහා නොවේ.
උදාහරණයක් ලෙස, ඔබ පෙදෙසක සිටී නම් zh_HK.big5hkscs
(හොංකොං, BIG5 චීන අක්ෂර කේතීකරණයේ හොංකොං ප්රභේදය භාවිතා කරමින්), සහ ඔබට එම අක්ෂරවල කේතනය කර ඇති ගොනුවක ඉංග්රීසි අකුරු සෙවීමට අවශ්ය නම්:
LC_ALL=C grep '[[:alpha:]]'
හෝ
LC_ALL=C grep '[a-zA-Z]'
වැරදියි, මන්ද එම අක්ෂර මාලාවේ (සහ තවත් බොහෝ දේ, නමුත් යූටීඑෆ් -8 එළියට පැමිණි දා සිට එතරම් භාවිතා නොකෙරේ), බොහෝ අක්ෂරවල A-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
පෙදෙසට අවශ්ය වන්නේ “අතේ ගෙන යා හැකි අක්ෂර කට්ටලයට” (ASCII 0-127) සහය දැක්වීමට පමණක් වන අතර, අක්ෂර> 127 සඳහා හැසිරීම තාක්ෂණිකව නිශ්චිතව දක්වා නැත . ප්රායෝගිකව, බොහෝ වැඩසටහන් ඒවා පාරදෘශ්ය දත්ත ලෙස සලකන අතර ඔබ විස්තර කළ පරිදි ඒවා හරහා ගමන් කරනු ඇත. නමුත් සියල්ලම නොවේ: විශේෂයෙන්, රූබී පෙදෙසෙහි ධාවනය වන්නේ නම් බයිට්> 127 සමඟ වර්ග දත්ත යටපත් කළ හැකිය C
. මම අවංකවම දන්නේ නැහැ එය තාක්ෂණිකව “අනුකූලද” කියා, නමුත් අපි එය වනයේ දැක ඇත්තෙමු .
perl
ගේ \x{7FFFFFFFFFFFFFFF}
) සහ සිංහල යුනිකෝඩ් කේත ලකුණු පරාසය අත්තනෝමතික U + 10FFFF සීමා කර ඇති අතර (UTF-16 සැලසුම් සීමාව නිසා), සමහර මෙවලම් තවමත් බයිට් අක්ෂර 6 ක් හඳුනාගෙන නිෂ්පාදනය කරයි. බයිට් අක්ෂර 6 කින් මා අදහස් කළේ එයයි. යුනික්ස් අර්ථ නිරූපණයෙහි, එක් අක්ෂරයක් එක් කේත ලක්ෂ්යයකි. ඔබේ එක් කේත ලක්ෂ්යයකට වඩා වැඩි “අක්ෂර” සාමාන්යයෙන් අක්ෂර වලින් වෙන්කර හඳුනා ගැනීම සඳහා ග්රැෆම් පොකුරු ලෙස සඳහන් කර ඇත.
C
පෙරනිමි ස්ථානය වේ, "පොසික්ස්" යනු "සී" හි අන්වර්ථයයි. මම හිතන්නේ "C" ව්යුත්පන්න වී ඇත්තේ ANSI-C වලින්. සමහර විට ANSI-C "POSIX" පෙදෙස අර්ථ දක්වයි.
C
පෙදෙසි නාමය "ANSI C" වෙතින් උපුටා ගත් බවක් අඟවන්නේ නැත .
මට කිව හැකි පරිදි, OS X යූටීඑෆ් -8 ස්ථානවල කේත ලක්ෂ්ය එකතු කිරීමේ අනුපිළිවෙල භාවිතා කරයි, එබැවින් එය ස්ටෙෆේන් චසෙලාස් විසින් පිළිතුරෙහි සඳහන් කර ඇති සමහර කරුණු වලට ව්යතිරේකයකි.
මෙය OS X හි 26 ක් සහ උබුන්ටු හි 310 මුද්රණය කරයි:
export LC_ALL=en_US.UTF-8
printf %b $(printf '\\U%08x\\n' $(seq $((0x11)) $((0x10ffff))))|grep -a '[a-z]'|wc -l
පහත කේතය OS X හි කිසිවක් මුද්රණය නොකරයි, එයින් ඇඟවෙන්නේ ආදානය වර්ග කර ඇති බවයි. ඉවත් කරන ලද අන්වර්ථ අක්ෂර හය නීති විරෝධී බයිට් අනුක්රමික දෝෂයක් ඇති කරයි.
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
පහත කේතය OS X හි කිසිවක් මුද්රණය නොකරයි, එයින් පෙන්නුම් කරන්නේ එකම කේත අනුපිළිවෙලක් ඇති අඛණ්ඩ කේත ලක්ෂ්ය දෙකක් (අවම වශයෙන් U + 000B සහ U + D7FF අතර) නොමැති බවයි.
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 හි දෝෂයක් ඇති බැවිනි.)
GNU පද්ධතිවල එකම සංයුක්ත අනුපිළිවෙලක් ඇති සමහර අක්ෂර සහ අනුක්රමයන් OS X හි එකම සංයුක්ත අනුපිළිවෙලක් නොමැත. මෙය මුද්රණය කරන්නේ ① පළමුව OS X හි (OS X sort
හෝ GNU භාවිතා කරමින් sort
) නමුත් ② පළමුව උබුන්ටු වල:
export LC_ALL=en_US.UTF-8;printf %s\\n ② ①|sort
මෙය OS X හි පේළි තුනක් මුද්රණය කරයි (OS X sort
හෝ GNU භාවිතා කරමින් 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