ทางออกสุดท้ายที่เป็นไปได้
ดังนั้นฉันได้รับข้อมูลด้านล่างทั้งหมดแล้วมาพร้อมกับสิ่งนี้:
for class in $(
locale -v LC_CTYPE |
sed 's/combin.*//;s/;/\n/g;q'
) ; do
printf "\n\t%s\n\n" $class
recode u2/test16 -q </dev/null |
tr -dc "[:$class:]" |
od -A n -t a -t o1z -w12
done
หมายเหตุ :
ฉันใช้od
เป็นตัวกรองสุดท้ายด้านบนสำหรับการตั้งค่าและเพราะฉันรู้ว่าฉันจะไม่ทำงานกับอักขระหลายไบต์ซึ่งจะไม่สามารถจัดการได้อย่างถูกต้อง recode u2..dump
ทั้งสองจะสร้างผลลัพธ์มากขึ้นเช่นเดียวกับที่ระบุในคำถามและจัดการกับอักขระที่กว้างอย่างถูกต้อง
เอาท์พุท
upper
A B C D E F G H I J K L
101 102 103 104 105 106 107 110 111 112 113 114 >ABCDEFGHIJKL<
M N O P Q R S T U V W X
115 116 117 120 121 122 123 124 125 126 127 130 >MNOPQRSTUVWX<
Y Z
131 132 >YZ<
lower
a b c d e f g h i j k l
141 142 143 144 145 146 147 150 151 152 153 154 >abcdefghijkl<
m n o p q r s t u v w x
155 156 157 160 161 162 163 164 165 166 167 170 >mnopqrstuvwx<
y z
171 172 >yz<
alpha
A B C D E F G H I J K L
101 102 103 104 105 106 107 110 111 112 113 114 >ABCDEFGHIJKL<
M N O P Q R S T U V W X
115 116 117 120 121 122 123 124 125 126 127 130 >MNOPQRSTUVWX<
Y Z a b c d e f g h i j
131 132 141 142 143 144 145 146 147 150 151 152 >YZabcdefghij<
k l m n o p q r s t u v
153 154 155 156 157 160 161 162 163 164 165 166 >klmnopqrstuv<
w x y z
167 170 171 172 >wxyz<
digit
0 1 2 3 4 5 6 7 8 9
060 061 062 063 064 065 066 067 070 071 >0123456789<
xdigit
0 1 2 3 4 5 6 7 8 9 A B
060 061 062 063 064 065 066 067 070 071 101 102 >0123456789AB<
C D E F a b c d e f
103 104 105 106 141 142 143 144 145 146 >CDEFabcdef<
space
ht nl vt ff cr sp
011 012 013 014 015 040 >..... <
print
sp ! " # $ % & ' ( ) * +
040 041 042 043 044 045 046 047 050 051 052 053 > !"#$%&'()*+<
, - . / 0 1 2 3 4 5 6 7
054 055 056 057 060 061 062 063 064 065 066 067 >,-./01234567<
8 9 : ; < = > ? @ A B C
070 071 072 073 074 075 076 077 100 101 102 103 >89:;<=>?@ABC<
D E F G H I J K L M N O
104 105 106 107 110 111 112 113 114 115 116 117 >DEFGHIJKLMNO<
P Q R S T U V W X Y Z [
120 121 122 123 124 125 126 127 130 131 132 133 >PQRSTUVWXYZ[<
\ ] ^ _ ` a b c d e f g
134 135 136 137 140 141 142 143 144 145 146 147 >\]^_`abcdefg<
h i j k l m n o p q r s
150 151 152 153 154 155 156 157 160 161 162 163 >hijklmnopqrs<
t u v w x y z { | } ~
164 165 166 167 170 171 172 173 174 175 176 >tuvwxyz{|}~<
graph
! " # $ % & ' ( ) * + ,
041 042 043 044 045 046 047 050 051 052 053 054 >!"#$%&'()*+,<
- . / 0 1 2 3 4 5 6 7 8
055 056 057 060 061 062 063 064 065 066 067 070 >-./012345678<
9 : ; < = > ? @ A B C D
071 072 073 074 075 076 077 100 101 102 103 104 >9:;<=>?@ABCD<
E F G H I J K L M N O P
105 106 107 110 111 112 113 114 115 116 117 120 >EFGHIJKLMNOP<
Q R S T U V W X Y Z [ \
121 122 123 124 125 126 127 130 131 132 133 134 >QRSTUVWXYZ[\<
] ^ _ ` a b c d e f g h
135 136 137 140 141 142 143 144 145 146 147 150 >]^_`abcdefgh<
i j k l m n o p q r s t
151 152 153 154 155 156 157 160 161 162 163 164 >ijklmnopqrst<
u v w x y z { | } ~
165 166 167 170 171 172 173 174 175 176 >uvwxyz{|}~<
blank
ht sp
011 040 >. <
cntrl
nul soh stx etx eot enq ack bel bs ht nl vt
000 001 002 003 004 005 006 007 010 011 012 013 >............<
ff cr so si dle dc1 dc2 dc3 dc4 nak syn etb
014 015 016 017 020 021 022 023 024 025 026 027 >............<
can em sub esc fs gs rs us del
030 031 032 033 034 035 036 037 177 >.........<
punct
! " # $ % & ' ( ) * + ,
041 042 043 044 045 046 047 050 051 052 053 054 >!"#$%&'()*+,<
- . / : ; < = > ? @ [ \
055 056 057 072 073 074 075 076 077 100 133 134 >-./:;<=>?@[\<
] ^ _ ` { | } ~
135 136 137 140 173 174 175 176 >]^_`{|}~<
alnum
0 1 2 3 4 5 6 7 8 9 A B
060 061 062 063 064 065 066 067 070 071 101 102 >0123456789AB<
C D E F G H I J K L M N
103 104 105 106 107 110 111 112 113 114 115 116 >CDEFGHIJKLMN<
O P Q R S T U V W X Y Z
117 120 121 122 123 124 125 126 127 130 131 132 >OPQRSTUVWXYZ<
a b c d e f g h i j k l
141 142 143 144 145 146 147 150 151 152 153 154 >abcdefghijkl<
m n o p q r s t u v w x
155 156 157 160 161 162 163 164 165 166 167 170 >mnopqrstuvwx<
y z
API ของ PROGRAMMER
ดังที่ฉันสาธิตด้านล่างrecode
จะให้แผนที่อักขระที่สมบูรณ์แก่คุณ ตามคู่มือของมันจะทำสิ่งนี้ตามค่าปัจจุบันของDEFAULT_CHARSET
ตัวแปรสภาพแวดล้อมหรือหากไม่สามารถทำงานได้ตามที่คุณระบุ:
เมื่อละเว้นชื่อชุดอักขระหรือเว้นว่างไว้ค่าของDEFAULT_CHARSET
ตัวแปรในสภาพแวดล้อมจะถูกนำมาใช้แทน หากไม่ได้กำหนดตัวแปรนี้ไว้recode
ไลบรารีจะใช้การเข้ารหัสของโลแคลปัจจุบัน บนระบบที่สอดคล้องกับPOSIXสิ่งนี้ขึ้นอยู่กับค่าที่ไม่ว่างแรกระหว่างตัวแปรสภาวะแวดล้อมLC_ALL, LC_CTYPE, LANG
และสามารถพิจารณาผ่านคำสั่งlocale charmap.
นอกจากนี้ที่น่าสังเกตrecode
ก็คือ api :
โปรแกรมที่ชื่อว่าrecode
เป็นเพียงแอปพลิเคชันของไลบรารีการเข้ารหัส ไลบรารีการเข้ารหัสมีให้แยกต่างหากสำหรับโปรแกรม C อื่น ๆ วิธีที่ดีในการทำความคุ้นเคยกับไลบรารีการถอดรหัสคือทำความคุ้นเคยกับrecode
โปรแกรมเอง
ในการใช้ไลบรารีการเข้ารหัสเมื่อติดตั้งแล้วโปรแกรม C จำเป็นต้องมีบรรทัด:
#include <recode.h>
สำหรับการเปรียบเทียบสตริงที่เป็นมิตรกับสากลPOSIX
และC
มาตรฐานกำหนดstrcoll()
ฟังก์ชัน:
strcoll()
ฟังก์ชั่นจะเปรียบเทียบสตริงชี้ไปตามs1
สตริงชี้ไปตามs2
ทั้งตีความตามความเหมาะสมกับหมวดหมู่ LC_COLLATE ของสถานที่ปัจจุบัน
strcoll()
ฟังก์ชั่นจะไม่เปลี่ยนการตั้งค่าของ errno ถ้าประสบความสำเร็จ
เนื่องจากไม่มีค่าตอบแทนถูกสงวนไว้เพื่อระบุข้อผิดพลาดแอปพลิเคชันที่ต้องการตรวจสอบสถานการณ์ข้อผิดพลาดควรตั้งค่า errno เป็น 0 จากนั้นโทร
strcoll()
แล้วตรวจสอบ errno
นี่คือแยกกันอยู่เป็นตัวอย่างของการใช้งาน:
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abc");
strcpy(str2, "ABC");
ret = strcoll(str1, str2);
if(ret > 0)
{
printf("str1 is less than str2");
}
else if(ret < 0)
{
printf("str2 is less than str1");
}
else
{
printf("str1 is equal to str2");
}
return(0);
}
เกี่ยวกับPOSIX
คลาสของตัวละครคุณได้ระบุว่าคุณใช้C
API เพื่อค้นหาสิ่งเหล่านี้แล้ว สำหรับอักขระ Unicode และคลาสคุณสามารถใช้ชุดอักขระrecode's
dump-with-namesเพื่อรับเอาต์พุตที่ต้องการ จากคู่มืออีกครั้ง :
ตัวอย่างเช่นคำสั่งrecode l2..full < input
หมายถึงการแปลงที่จำเป็นจากLatin-2ถึงUCS-2เนื่องจากการเชื่อมต่อdump-with-namesมีเพียงการเชื่อมต่อจากUCS-2 เท่านั้น ในกรณีดังกล่าวrecode
ไม่แสดงต้นฉบับ
ภาษาละติน-2รหัสในการถ่ายโอนข้อมูลเพียงที่สอดคล้องUCS 2ค่า เพื่อให้ตัวอย่างง่ายกว่าคำสั่ง
echo 'Hello, world!' | recode us..dump
สร้างเอาต์พุตต่อไปนี้:
UCS2 Mne Description
0048 H latin capital letter h
0065 e latin small letter e
006C l latin small letter l
006C l latin small letter l
006F o latin small letter o
002C , comma
0020 SP space
0077 w latin small letter w
006F o latin small letter o
0072 r latin small letter r
006C l latin small letter l
0064 d latin small letter d
0021 ! exclamation mark
000A LF line feed (lf)
ความคิดเห็นเชิงพรรณนามีให้ในภาษาอังกฤษและ ASCII แต่หากคำอธิบายภาษาอังกฤษไม่พร้อมใช้งาน แต่เป็นภาษาฝรั่งเศสคำอธิบายภาษาฝรั่งเศสจะได้รับแทนโดยใช้ Latin-1 อย่างไรก็ตามหาก
ตัวแปรLANGUAGE
หรือLANG
สภาพแวดล้อมเริ่มต้นด้วยตัวอักษรfrการตั้งค่าการแสดงรายการจะเป็นภาษาฝรั่งเศสเมื่อทั้งสองคำอธิบายพร้อมใช้งาน
การใช้ไวยากรณ์ที่คล้ายกับข้างบนรวมกับชุดข้อมูลการทดสอบที่รวมอยู่ฉันสามารถใช้ผังตัวละครของฉันเองด้วย:
recode -q u8/test8..dump </dev/null
เอาท์พุท
UCS2 Mne Description
0001 SH start of heading (soh)
0002 SX start of text (stx)
0003 EX end of text (etx)
...
002B + plus sign
002C , comma
002D - hyphen-minus
...
0043 C latin capital letter c
0044 D latin capital letter d
0045 E latin capital letter e
...
006B k latin small letter k
006C l latin small letter l
006D m latin small letter m
...
007B (! left curly bracket
007C !! vertical line
007D !) right curly bracket
007E '? tilde
007F DT delete (del)
แต่สำหรับตัวละครทั่วไปrecode
ดูเหมือนว่าไม่จำเป็น สิ่งนี้จะให้ชื่อตัวอักษรสำหรับทุกสิ่งในชุดอักขระขนาด 128 ไบต์:
printf %b "$(printf \\%04o $(seq 128))" |
luit -c |
od -A n -t o1z -t a -w12
เอาท์พุท
001 002 003 004 005 006 007 010 011 012 013 014 >............<
soh stx etx eot enq ack bel bs ht nl vt ff
...
171 172 173 174 175 176 177 >yz{|}~.<
y z { | } ~ del
แน่นอนมีเพียง 128- ไบต์เท่านั้นที่แสดง แต่นั่นเป็นเพราะ locale ของฉัน, utf-8 charmaps หรือไม่, ใช้ชุดอักขระASCIIและไม่มีอะไรเพิ่มเติม นั่นคือทั้งหมดที่ฉันได้รับ ถ้าฉันวิ่งโดยไม่ต้องluit
กรองมันod
จะม้วนกลับมาและพิมพ์แผนที่เดียวกันอีกครั้ง\0400.
มีสองปัญหาที่สำคัญกับวิธีการข้างต้นแม้ว่า อันดับแรกมีการเรียงลำดับของระบบ - สำหรับตำแหน่งที่ไม่ใช่ ASCII ค่าการกัดสำหรับชุดอักขระไม่ได้เป็นเพียงแค่ในseq
สิ่งที่ฉันคิดว่าน่าจะเป็นแกนหลักของปัญหาที่คุณกำลังพยายามแก้ไข
tr's man
หน้าGNU ระบุว่ามันจะขยาย[:upper:]
[:lower:]
ชั้นเรียนตามลำดับ - แต่นั่นก็ไม่มาก
ฉันจินตนาการว่าโซลูชันหนัก ๆ สามารถใช้งานได้sort
แต่นั่นเป็นเครื่องมือที่ค่อนข้างลำบากสำหรับ API การเขียนโปรแกรมส่วนหลัง
recode
จะทำสิ่งนี้อย่างถูกต้อง แต่คุณไม่ได้รักโปรแกรมมากเกินไปเมื่อวันก่อน บางทีการแก้ไขในวันนี้อาจทำให้เกิดแสงที่เป็นมิตรมากกว่านี้หรืออาจจะไม่
GNU ยังมีgettext
ห้องสมุดฟังก์ชั่นและดูเหมือนว่าจะสามารถแก้ไขปัญหานี้ได้อย่างน้อยสำหรับLC_MESSAGES
บริบท:
- ฟังก์ชั่น: char * bind_textdomain_codeset
( const char *domainname,
const char *codeset
)
bind_textdomain_codeset
ฟังก์ชั่นสามารถนำมาใช้เพื่อระบุตัวอักษรชุดเอาท์พุแคตตาล็อกข้อความสำหรับโดเมน
DOMAINNAME codesetอาร์กิวเมนต์ต้องเป็นที่ถูกต้องcodesetชื่อซึ่งสามารถใช้สำหรับiconv_openฟังก์ชั่นหรือตัวชี้โมฆะ
หากcodesetพารามิเตอร์เป็นตัวชี้ null ที่bind_textdomain_codeset
ส่งกลับเลือกในปัจจุบันcodesetสำหรับโดเมนที่มีชื่อ
DOMAINNAME มันกลับ NULL ถ้าไม่มีcodesetยังไม่ได้รับเลือก
bind_textdomain_codeset
ฟังก์ชั่นสามารถนำมาใช้หลายครั้ง หากใช้หลายครั้งด้วยอาร์กิวเมนต์ domainname เดียวกันการโทรในภายหลังจะแทนที่การตั้งค่าที่ทำไว้ก่อนหน้านี้
bind_textdomain_codeset
ฟังก์ชั่นกลับชี้ไปสตริงที่มีชื่อของ codeset ที่เลือก สตริงถูกจัดสรรภายในในฟังก์ชันและต้องไม่ถูกเปลี่ยนแปลงโดยผู้ใช้ หากระบบออกจากแกนระหว่างการดำเนิน
bind_textdomain_codeset
การค่าส่งคืนจะเป็น NULL และตั้งค่าตัวแปรโลก errno ตามลำดับ
คุณอาจใช้หมวดหมู่อักขระ Unicodeดั้งเดิมซึ่งเป็นภาษาที่ไม่ขึ้นต่อกันและนำหน้าคลาส POSIX ไปด้วยกันหรืออาจจะเรียกใช้ในอดีตเพื่อให้ข้อมูลเพียงพอที่จะให้คำจำกัดความหลัง
นอกเหนือจากภาวะแทรกซ้อน Unicode ยังนำความเป็นไปได้ใหม่ ๆ หนึ่งคืออักขระ Unicode แต่ละตัวอยู่ในหมวดหมู่ที่แน่นอน คุณสามารถตรงกับตัวอักษรตัวเดียวที่อยู่ในหมวดหมู่ "ตัวอักษร"
\p{L}
ด้วย \P{L}
คุณสามารถตรงกับตัวอักษรตัวเดียวที่ไม่ได้อยู่ในหมวดหมู่ที่มี
อีกครั้ง "ตัวอักษร" หมายถึง "จุดรหัส Unicode" จริงๆ \p{L}
ตรงกับจุดรหัสเดียวในหมวดหมู่ "จดหมาย" หากสตริงการป้อนข้อมูลของคุณถูกà
เข้ารหัสเป็นสตริงจะU+0061 U+0300
จับคู่a
โดยไม่มีเครื่องหมายเน้นเสียง หากอินพุตถูกà
เข้ารหัสเป็นU+00E0
มันจะตรงà
กับสำเนียง เหตุผลก็คือทั้งจุดรหัสU+0061 (a)
และU+00E0 (à)
อยู่ในหมวดหมู่ "ตัวอักษร" ในขณะที่U+0300
อยู่ในหมวดหมู่ "เครื่องหมาย"
ตอนนี้คุณควรเข้าใจว่าทำไมเป็นเทียบเท่าของ
\P{M}\p{M}*+
จับคู่จุดรหัสที่ไม่ใช่เครื่องหมายการรวมขณะที่
จับคู่จุดศูนย์หรือมากกว่านั้นที่รวมเครื่องหมาย เพื่อให้ตรงกับตัวอักษรรวมทั้งกำกับใด ๆ การใช้งาน regex สุดท้ายนี้จะจับคู่เสมอไม่ว่าจะเข้ารหัสอย่างไร Quantifier ที่เป็นเจ้าของทำให้แน่ใจว่าการย้อนรอยไม่ทำให้เกิดการจับคู่ที่ไม่ใช่เครื่องหมายหากไม่มีเครื่องหมายรวมที่ตามมาซึ่ง
จะไม่มีวันทำ\X
\P{M}
\p{M}*+
\p{L}\p{M}*+
à
\P{M}\p{M}*+
\X
เว็บไซต์เดียวกับที่ให้ข้อมูลข้างต้นยังกล่าวถึงการติดตั้ง regex ที่สอดคล้องกับPOSIXTcl
ของตัวเองซึ่งอาจเป็นอีกวิธีหนึ่งในการบรรลุเป้าหมายของคุณ
และสุดท้ายในบรรดาวิธีการแก้ปัญหาฉันจะแนะนำให้คุณสอบปากคำLC_COLLATE
ตัวไฟล์เองสำหรับการแม็พอักขระระบบที่สมบูรณ์และตามลำดับ สิ่งนี้อาจดูไม่ง่ายนัก แต่ฉันก็ประสบความสำเร็จด้วยการรวบรวมlocaledef
ดังต่อไปนี้
<LC_COLLATE od -j2K -a -w2048 -v |
tail -n2 |
cut -d' ' -f$(seq -s',' 4 2 2048) |
sed 's/nul\|\\0//g;s/ */ /g;:s;
s/\([^ ]\{1,3\}\) \1/\1/;ts;
s/\(\([^ ][^ ]* *\)\{16\}\)/\1\n/g'
dc1 dc2 dc3 dc4 nak syn etb can c fs c rs c sp ! "
# $ % & ' ( ) * + , - . / 0 1 2
3 4 5 6 7 8 9 : ; < = > ? @ A B
C D E F G H I J K L M N O P Q R
S T U V W X Y Z [ \ ] ^ _ ` a b
c d e f g h i j k l m n o p q r
s t u v w x y z { | } ~ del soh stx etx
eot enq ack bel c ht c vt cr c si dle dc1 del
เป็นที่ยอมรับในปัจจุบันมีข้อบกพร่อง แต่ฉันหวังว่ามันจะแสดงให้เห็นถึงความเป็นไปได้อย่างน้อย
ในการปัดแก้มครั้งแรก
strings $_/en_GB
#OUTPUT
int_select "<U0030><U0030>"
...
END LC_TELEPHONE
มันดูเหมือนไม่มาก แต่แล้วฉันก็เริ่มสังเกตเห็นcopy
คำสั่งตลอดรายการ ไฟล์ดังกล่าวดูเหมือนว่าจะcopy
อยู่ใน"en_US"และอีกไฟล์ใหญ่จริงที่ดูเหมือนว่าพวกเขาทั้งหมดแชร์ในระดับiso_14651_t1_common
หนึ่ง
มันค่อนข้างใหญ่:
strings $_ | wc -c
#OUTPUT
431545
นี่คือคำนำของ/usr/share/i18n/locales/POSIX
:
# Territory:
# Revision: 1.1
# Date: 1997-03-15
# Application: general
# Users: general
# Repertoiremap: POSIX
# Charset: ISO646:1993
# Distribution and use is free, also for
# commercial purposes.
LC_CTYPE
# The following is the POSIX Locale LC_CTYPE.
# "alpha" is by default "upper" and "lower"
# "alnum" is by definiton "alpha" and "digit"
# "print" is by default "alnum", "punct" and the <U0020> character
# "graph" is by default "alnum" and "punct"
upper <U0041>;<U0042>;<U0043>;<U0044>;<U0045>;<U0046>;<U0047>;<U0048>;\
<U0049>;<U004A>;<U004B>;<U004C>;<U004D>;<U004E>;<U004F>;
...
คุณสามารถgrep
ผ่านหลักสูตรนี้ได้ แต่คุณอาจจะ:
recode -lf gb
แทน. คุณจะได้รับสิ่งนี้:
Dec Oct Hex UCS2 Mne BS_4730
0 000 00 0000 NU null (nul)
1 001 01 0001 SH start of heading (soh)
...
... และอื่น ๆ
นอกจากนี้ยังluit
มีpty
อุปกรณ์แปลเทอร์มินัล UTF-8 ฉันเดาว่าจะทำหน้าที่เป็นไประหว่าง XTerms โดยไม่รองรับ UTF-8 มันจัดการกับสวิตช์มากมาย - เช่นการบันทึกไบต์ที่ถูกแปลงทั้งหมดไปยังไฟล์หรือ-c
เป็น|pipe
ตัวกรองอย่างง่าย
ฉันไม่เคยรู้เลยว่ามันมีอะไรมากมาย - สถานที่และแผนที่ตัวละครและทุกสิ่ง เห็นได้ชัดว่านี่เป็นเรื่องใหญ่มากแต่ฉันคิดว่าทุกอย่างจะดำเนินไปในเบื้องหลัง มีอย่างน้อยในระบบของฉันมีสองสามร้อยman 3
ผลลัพธ์ที่เกี่ยวข้องสำหรับการค้นหาที่เกี่ยวข้องกับสถานที่เกิดเหตุ
และยังมี:
zcat /usr/share/i18n/charmaps/UTF-8*gz | less
CHARMAP
<U0000> /x00 NULL
<U0001> /x01 START OF HEADING
<U0002> /x02 START OF TEXT
<U0003> /x03 END OF TEXT
<U0004> /x04 END OF TRANSMISSION
<U0005> /x05 ENQUIRY
...
ว่าจะไปหามากยาวในขณะที่
Xlib
ฟังก์ชั่นการจัดการนี้ตลอดเวลา - luit
เป็นส่วนหนึ่งของแพคเกจที่
Tcl_uni...
ฟังก์ชั่นอาจพิสูจน์ประโยชน์เช่นกัน
เพิ่ง<tab>
เสร็จสิ้นเล็กน้อยและman
การค้นหาและฉันได้เรียนรู้มากมายในเรื่องนี้
ด้วยlocaledef
- คุณสามารถรวบรวมlocales
ในI18N
ไดเรกทอรีของคุณ ผลลัพธ์เป็นเรื่องขี้ขลาดและไม่มีประโยชน์เป็นพิเศษ - ไม่เหมือนcharmaps
แต่อย่างใด - แต่คุณสามารถรับรูปแบบ raw ตามที่คุณระบุข้างต้นเหมือนที่ฉันทำ:
mkdir -p dir && cd $_ ; localedef -f UTF-8 -i en_GB ./
ls -l
total 1508
drwxr-xr-x 1 mikeserv mikeserv 30 May 6 18:35 LC_MESSAGES
-rw-r--r-- 1 mikeserv mikeserv 146 May 6 18:35 LC_ADDRESS
-rw-r--r-- 1 mikeserv mikeserv 1243766 May 6 18:35 LC_COLLATE
-rw-r--r-- 1 mikeserv mikeserv 256420 May 6 18:35 LC_CTYPE
-rw-r--r-- 1 mikeserv mikeserv 376 May 6 18:35 LC_IDENTIFICATION
-rw-r--r-- 1 mikeserv mikeserv 23 May 6 18:35 LC_MEASUREMENT
-rw-r--r-- 1 mikeserv mikeserv 290 May 6 18:35 LC_MONETARY
-rw-r--r-- 1 mikeserv mikeserv 77 May 6 18:35 LC_NAME
-rw-r--r-- 1 mikeserv mikeserv 54 May 6 18:35 LC_NUMERIC
-rw-r--r-- 1 mikeserv mikeserv 34 May 6 18:35 LC_PAPER
-rw-r--r-- 1 mikeserv mikeserv 56 May 6 18:35 LC_TELEPHONE
-rw-r--r-- 1 mikeserv mikeserv 2470 May 6 18:35 LC_TIME
จากนั้นod
คุณสามารถอ่านได้ - ไบต์และสตริง:
od -An -a -t u1z -w12 LC_COLLATE | less
etb dle enq sp dc3 nul nul nul T nul nul nul
23 16 5 32 19 0 0 0 84 0 0 0 >... ....T...<
...
แม้ว่ามันจะห่างไกลจากการชนะการประกวดความงาม และod
สามารถปรับแต่งได้ตามที่คุณต้องการแน่นอน
ฉันเดาว่าฉันลืมเรื่องเหล่านี้ด้วย:
perl -mLocale
-- Perl module --
Locale::Codes Locale::Codes::LangFam Locale::Codes::Script_Retired
Locale::Codes::Constants Locale::Codes::LangFam_Codes Locale::Country
Locale::Codes::Country Locale::Codes::LangFam_Retired Locale::Currency
Locale::Codes::Country_Codes Locale::Codes::LangVar Locale::Language
Locale::Codes::Country_Retired Locale::Codes::LangVar_Codes Locale::Maketext
Locale::Codes::Currency Locale::Codes::LangVar_Retired Locale::Maketext::Guts
Locale::Codes::Currency_Codes Locale::Codes::Language Locale::Maketext::GutsLoader
Locale::Codes::Currency_Retired Locale::Codes::Language_Codes Locale::Maketext::Simple
Locale::Codes::LangExt Locale::Codes::Language_Retired Locale::Script
Locale::Codes::LangExt_Codes Locale::Codes::Script Locale::gettext
Locale::Codes::LangExt_Retired Locale::Codes::Script_Codes locale
ฉันอาจลืมเกี่ยวกับพวกเขาเพราะฉันไม่สามารถทำงานได้ ฉันไม่เคยใช้Perl
และไม่รู้วิธีการโหลดโมดูลอย่างถูกต้องฉันเดา แต่man
หน้าดูดีทีเดียว ไม่ว่าในกรณีใดจะมีบางอย่างบอกฉันว่าคุณจะพบว่าการเรียกโมดูล Perl อย่างน้อยก็น้อยยากกว่าที่ฉันทำและอีกครั้งสิ่งเหล่านี้อยู่ในคอมพิวเตอร์ของฉันแล้ว - และฉันก็ไม่เคยใช้ Perl นอกจากนี้ยังมีบางส่วนI18N
ที่ฉันเลื่อนดูด้วยความรู้เต็มว่าฉันจะไม่ทำให้พวกเขาทำงาน
/usr/share/i18n/locales/i18n
... ซึ่งแน่นอนมาจากฐานข้อมูล Unicode Character แน่นอนว่าจะเป็นการดีถ้ามีคำสั่ง