বর্তমান লোকালে প্রদত্ত একটি অক্ষর শ্রেণিতে অক্ষরের তালিকা পুনরুদ্ধার করতে আদেশ


18

কি একটি প্রদত্ত চরিত্র ক্লাসে সমস্ত অক্ষর (যেমন একটি তালিকা পুনরুদ্ধার করতে একটি উপায় হতে পারে blank, alpha, digit...) বর্তমান লোকেলে।

এই ক্ষেত্রে,

LC_ALL=en_GB.UTF-8 that-command blank

আদর্শভাবে, আমার ডেবিয়ান সিস্টেমে এমন কিছু প্রদর্শন করা হবে:

      09 U+0009 HORIZONTAL TAB
      20 U+0020 SPACE
e1 9a 80 U+1680 OGHAM SPACE MARK
e1 a0 8e U+180E MONGOLIAN VOWEL SEPARATOR
e2 80 80 U+2000 EN QUAD
e2 80 81 U+2001 EM QUAD
e2 80 82 U+2002 EN SPACE
e2 80 83 U+2003 EM SPACE
e2 80 84 U+2004 THREE-PER-EM SPACE
e2 80 85 U+2005 FOUR-PER-EM SPACE
e2 80 86 U+2006 SIX-PER-EM SPACE
e2 80 88 U+2008 PUNCTUATION SPACE
e2 80 89 U+2009 THIN SPACE
e2 80 8a U+200A HAIR SPACE
e2 81 9f U+205F MEDIUM MATHEMATICAL SPACE
e3 80 80 U+3000 IDEOGRAPHIC SPACE

এবং সি লোকেলে এমন কিছু প্রদর্শন করতে পারে:

09 U+0009 HORIZONTAL TAB
20 U+0020 SPACE

এটি হল, বাইটের অ্যারেগুলির ক্ষেত্রে লোকেলতে চরিত্রটির প্রতিনিধিত্ব, (প্রথম উদাহরণে ইউটিএফ -8 এবং দ্বিতীয়টিতে একক বাইট), সমতুল্য ইউনিকোড অক্ষর কোডপয়েন্ট এবং একটি বিবরণ।

প্রসঙ্গ

(সম্পাদনা) এখন যে দুর্বলতা দীর্ঘকাল ধরে প্যাচ এবং প্রকাশ করা হয়েছে, আমি কিছুটা প্রসঙ্গ যুক্ত করতে পারি।

আমি সিভিই 2014-0475 তদন্তের সময় আমি এই প্রশ্নটি জিজ্ঞাসা করেছিglibcএতে একটি ত্রুটি ছিল যা এটি ব্যবহারকারীর মতো লোকেলগুলি LC_ALL=../../../../tmp/evil-localeস্ট্যান্ডার্ড সিস্টেম লোকেল অনুসন্ধানের পথের তুলনায় সমাধান করা যায় এবং এভাবে কোনও ফাইলকে স্থানীয় সংজ্ঞা হিসাবে ব্যবহার করার অনুমতি দেয়।

আমি একটি দুর্বৃত্ত লোকেল তৈরী করতে পারে চরিত্র অক্ষরসেট প্রতি একটি একক বাইট যেখানে ব্যতীত সবচেয়ে অক্ষর উদাহরণস্বরূপ s, hএবং অন্য কয়েকজন হিসেবে বিবেচনা করা হতো ঐ খালি এবং যে হবে bashচালানোর shএকটি টিপিক্যাল ডেবিয়ান পার্স করার সময় /etc/bash.bashrcফাইল (এবং যে একটি উপর শেল প্রবেশাধিকার পেতে ব্যবহার করা যেতে পারে gitউদাহরণস্বরূপ প্রদত্ত হোস্টিং সার্ভারটি সার্ভার ব্যবহারকারীর bashলগইন শেল হিসাবে ব্যবহৃত হয় gitএবং এটি যে sshসার্ভারটি LC_*/ LANGভেরিয়েবল গ্রহণ করে এবং আক্রমণকারী সার্ভারে ফাইলগুলি আপলোড করতে পারে)।

এখন, যদি আমি কখনই একটি LC_CTYPE(সংকলিত লোকেল সংজ্ঞা) /tmp/evilখুঁজে পেয়েছি তবে কীভাবে খুঁজে পাব যে এটি একটি দুর্বৃত্ত এবং কোন উপায়ে ছিল।

সুতরাং আমার লক্ষ্যটি সেই লোকাল সংজ্ঞাটি সংকলন করা এবং যদি তা না হয় তবে অন্তত জেনে নিন কোন বর্ণটি (তাদের এনকোডিং সহ) প্রদত্ত একটি অক্ষর শ্রেণিতে রয়েছে।

তাই মনে রেখে:

  • সমাধানগুলির জন্য লোকেলগুলির উত্স ফাইলগুলি দেখে ( /usr/share/i18n/localeডেবিয়ানের মতো লোকালের সংজ্ঞাগুলি ) আমার ক্ষেত্রে কোনও ব্যবহারের নয়।
  • ইউনিকোড চরিত্রের বৈশিষ্ট্যগুলি অপ্রাসঙ্গিক। আমি কেবল লোকাল কী বলে সে সম্পর্কে যত্নশীল। একটি ডেবিয়ান সিস্টেমে এমনকি দুটি ইউটিএফ -8 সিস্টেম লোকেলের মধ্যেও দুর্বৃত্তদের ছেড়ে দেওয়া যাক, শ্রেণীর অক্ষরের তালিকাটি আলাদা হতে পারে।
  • সরঞ্জামের মত recode, pythonবা perlযে বাইট / বহু-বাইট করতে / চরিত্র রূপান্তর থেকে তারা may (এবং বাস্তবে না) ব্যবহার করা যাবে না লোকেল চেয়ে অন্যভাবে রূপান্তর করা।

বেশিরভাগ লোকেলের ক্ষেত্রে এটি শেষ পর্যন্ত এলসি_সিটিওয়াইপি স্টাফ থেকে আসে (গ্লাবসি সহ) /usr/share/i18n/locales/i18n... যা অবশ্যই ইউনিকোড চরিত্রের ডেটাবেস থেকে মূলত আসে। অবশ্যই, এটি একটি কমান্ড
পেয়ে ভাল লাগবে

@ এরোবার্ট, হ্যাঁ, যদিও locale(কমপক্ষে জিএনইউ এক) বিভিন্ন বিভাগে সঞ্চিত অনেক তথ্য পুনরুদ্ধার করে, যে জিনিসগুলি এটি LC_CTYPE এবং LC_COLLATE তে সর্বাধিক গুরুত্বপূর্ণ নয় ones আমি অবাক হয়েছি যদি সেই তথ্যটি পুনরুদ্ধার করতে বা স্থানীয় তথ্যকে সংকলিত করার জন্য কোনও লুকানো API থাকে।
স্টাফেন চেজেলাস

হ্যাঁ - আপনি সেই তথ্যটিকে বিশ্লেষণ করতে পারেন - আমি শেষ পর্যন্ত আমার সম্পাদনাটি গুটিয়ে ফেলি। আপনি সম্ভবত ইতিমধ্যে ইনস্টল করেছেন এমন কয়েকটি কমান্ড রয়েছে - কমপক্ষে আমি করেছিলাম এবং সেগুলি সম্পর্কে আমি জানতাম না। আমি আসা করি এটা সাহায্য করবে. বিশেষত recodeএবং uconvআপনি যা বলছেন তা আপনি আপনাকে দিতে পারেন। সম্ভবত এমনকি ন্যায়বিচার luitএবং odআমি অনুমান করি ...
মাইকজার্ভ

সেটা খুব ভালো! তার মানে আপনার কোনও প্রয়োজন নেই perl, আমি মনে করি।
মাইকজার্ভ

আমি মনে করি মূলত আমার চরসেটটি LC_CTYPEকেবলমাত্র od -A n -t c <LC_CTYPE | tsortএটির মাধ্যমেই বের করে নিতে সক্ষম হয়েছি তবে আমি এর আগে কখনও শুনিনি এবং আমি এটি পড়ছিলাম infoএবং এটি আমাকে এটির স্মরণ করিয়ে দিয়েছে - এবং এটি কার্যকর বলে মনে হচ্ছে। এছাড়াও আছে ptxতবে আমি মনে করি এটি কম প্রাসঙ্গিক। যাইহোক, আপনি যদি এটি চেষ্টা না করে থাকেন এবং এটি করার সিদ্ধান্ত নেন - ন্যায্য সতর্কতা - এটির জন্য একটু ধৈর্য দরকার। lehman.cuny.edu/cgi-bin/man-cgi?tsort+1
mikeserv

উত্তর:


7

সম্ভাব্য শেষ সমাধান

সুতরাং আমি নীচের সমস্ত তথ্য নিয়েছি এবং এটি নিয়ে এসেছি:

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

প্রোগ্রামার এর এপিআই

আমি নীচে প্রদর্শিত হিসাবে, recodeআপনি আপনার সম্পূর্ণ চরিত্রের মানচিত্র সরবরাহ করবে। এর ম্যানুয়াল অনুসারে, এটি DEFAULT_CHARSETপরিবেশের পরিবর্তনশীলের বর্তমান মান অনুযায়ী প্রথমে এটি করে বা এটি ব্যর্থ হয়ে এটি আপনার নির্দিষ্ট হিসাবে ঠিক কাজ করে:

যখন একটি চরসেট নাম বাদ দেওয়া হয় বা খালি ছেড়ে যায়, DEFAULT_CHARSETপরিবর্তে পরিবেশে ভেরিয়েবলের মান ব্যবহৃত হয়। যদি এই ভেরিয়েবলটি সংজ্ঞায়িত না করা হয় তবে recodeগ্রন্থাগারটি বর্তমান লোকেলের এনকোডিং ব্যবহার করে। উপর POSIX অনুবর্তী সিস্টেম, এই পরিবেশের মধ্যে প্রথম খালি নয় এমন মান উপর নির্ভর করে LC_ALL, LC_CTYPE, LANGএবং কমান্ড মাধ্যমে নির্ধারণ করা যেতে পারেlocale charmap.

এছাড়াও সম্পর্কে টুকুনি recodeযে এটা একটি API হয় :

প্রোগ্রামটির নামকরণ recodeএটির পুনরায় পুনর্নির্মাণের পাঠাগারটির কেবল একটি অ্যাপ্লিকেশন। পুনর্নির্মাণের পাঠাগারটি অন্যান্য সি প্রোগ্রামগুলির জন্য পৃথকভাবে উপলব্ধ। রিকডিং লাইব্রেরির সাথে কিছুটা পরিচিতি অর্জনের একটি ভাল উপায় হ'ল recodeপ্রোগ্রামটির সাথেই পরিচিত ।

একবার ইনস্টল হয়ে গেলে পুনরায় কোডিং লাইব্রেরিটি ব্যবহার করতে, একটি সি প্রোগ্রামের একটি লাইন থাকা দরকার:

#include <recode.h>

আন্তর্জাতিকভাবে বন্ধুত্বপূর্ণ স্ট্রিং তুলনার জন্য POSIXএবং Cমানগুলি কার্যটি সংজ্ঞায়িত করে strcoll():

strcoll()ফাংশন দ্বারা স্ট্রিং তীক্ষ্ন তুলনা করব s1স্ট্রিং দ্বারা নির্দিষ্ট s2, উভয় বর্তমান লোকেল এর LC_COLLATE বিভাগ যথাযথ হিসেবে ব্যাখ্যা।

strcoll()ফাংশন errno সফল হলে এর সেটিং পরিবর্তন করবে না।

যেহেতু কোনও ত্রুটি চিহ্নিত করার জন্য কোনও রিটার্নের মান সংরক্ষিত নেই, ত্রুটি পরিস্থিতিগুলি পরীক্ষা করতে চাইলে একটি অ্যাপ্লিকেশনটির 0 থেকে errno সেট করা উচিত, তারপরে কল করুন এবং strcoll()এর্নন পরীক্ষা করুন।

এখানে এটির ব্যবহারের পৃথক পৃথক উদাহরণ রয়েছে:

#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চরিত্রের ক্লাসগুলির বিষয়ে , আপনি ইতিমধ্যে এটিকে CAPI ব্যবহার করার জন্য এপিআই ব্যবহার করেছেন বলে উল্লেখ করেছেন । ইউনিকোড চরিত্র এবং ক্লাসগুলির জন্য আপনি পছন্দসই আউটপুট পেতে recode's ডাম্প-উইথ-নেম চার্সেট ব্যবহার করতে পারেন । এর ম্যানুয়াল থেকে আবার :

উদাহরণস্বরূপ, কমান্ডটি ল্যাটিন -২ থেকে ইউসিএস -২ এrecode l2..full < input প্রয়োজনীয় রূপান্তরকে বোঝায় , কারণ ডাম্প-সহ নামগুলি কেবল ইউসিএস -২ থেকে সংযুক্ত থাকে এই জাতীয় ক্ষেত্রে, ডাম্পে মূল ল্যাটিন -2 কোডগুলি প্রদর্শন করে না , কেবলমাত্র সংশ্লিষ্ট ইউসিএস -2 মান। একটি সহজ উদাহরণ দিতে, কমান্ডrecode

 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)

বর্ণনামূলক মন্তব্যটি ইংরেজী এবং এএসসিআইআইতে দেওয়া হয়েছে, তবুও যদি ইংরেজী বিবরণ উপলব্ধ না হয় তবে একটি ফরাসী ভাষায় থাকে তবে লাতিন -১ ব্যবহার করে পরিবর্তে ফরাসি বিবরণ দেওয়া হয়। যাইহোক, যদি LANGUAGEবা LANGএনভায়রনমেন্ট ভেরিয়েবল অক্ষর দিয়ে শুরু হয় ফরাসী ভাষায় , তারপর তালিকা পক্ষপাত ফরাসি যায় যখন উভয় বর্ণনা পাওয়া যায়।

এর অন্তর্ভুক্ত পরীক্ষার ডেটাসেটের সাথে মিলিত উপরের অনুরূপ সিনট্যাক্স ব্যবহার করে আমি নিজের চরিত্রের মানচিত্রটি এর সাথে পেতে পারি:

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-বাইট প্রতিনিধিত্ব করা হয়, তবে এটি আমার লোকেল, ইউটিএফ -8 চারম্যাপ বা না, এএসসিআইআই চরসেট ব্যবহার করে এবং আরও কিছু না। তাই আমি সব পেতে। আমি যদি এটি luitফিল্টার না করে চালিয়ে যাই তবে odএটিকে আবার ঘুরিয়ে দিত এবং আবার একই মানচিত্রটি আবার মুদ্রণ করতে পারে\0400.

যদিও উপরের পদ্ধতিটি নিয়ে দুটি বড় সমস্যা রয়েছে। প্রথমে সিস্টেমের কোলেশন অর্ডার রয়েছে - অ-এসকিআইআই-এর জন্য অক্ষর জন্য মানচিত্রগুলি seqচরসেটগুলি কেবল উত্সরূপে হয় না , যা আমি মনে করি, সম্ভবত আপনি যে সমস্যার সমাধান করার চেষ্টা করছেন তার মূল কারণ।

ঠিক আছে, জিএনইউ tr's manপৃষ্ঠাতে বলা হয়েছে যে এটি ক্রমগুলি [:upper:] [:lower:]ক্রম প্রসারিত করবে - তবে এটি খুব বেশি কিছু নয়।

আমি কল্পনা করি যে কিছু ভারী হাতের সমাধান এর সাথে প্রয়োগ করা যেতে পারে sortতবে এটি ব্যাকএন্ড প্রোগ্রামিং এপিআইয়ের জন্য বরং এক অনর্থক সরঞ্জাম।

recodeএই জিনিসটি সঠিকভাবে করবে, তবে অন্য দিন আপনি প্রোগ্রামটির সাথে খুব বেশি ভালোবাসেন বলে মনে হয় নি। সম্ভবত আজকের সম্পাদনাগুলি এটিতে আরও বন্ধুত্বপূর্ণ আলো ফেলবে বা নাও পারে।

জিএনইউ gettextফাংশন লাইব্রেরিটিও সরবরাহ করে এবং কমপক্ষে প্রসঙ্গে এই সমস্যাটিকে মোকাবেলা করতে সক্ষম বলে মনে হচ্ছে LC_MESSAGES:

- কার্য: char * bind_textdomain_codeset( const char *domainname, const char *codeset)

bind_textdomain_codesetফাংশন ডোমেনের জন্য বার্তা ক্যাটালগ জন্য আউটপুট অক্ষর সেট নির্দিষ্ট করতে ব্যবহার করা যেতে পারে DOMAINNAMECodeset যুক্তি বৈধ হতে হবে codeset নাম, যার জন্য ব্যবহার করা যেতে পারে iconv_open ফাংশন, অথবা একটি নাল পয়েন্টার।

তাহলে codeset প্যারামিটার নাল পয়েন্টার হয়, bind_textdomain_codeset বর্তমানে নির্বাচিত ফেরৎ codeset নামের সঙ্গে ডোমেনের জন্য DOMAINNAME । কোনও কোডসেট এখনও নির্বাচন না করা থাকলে এটি NULL প্রদান করে ।

bind_textdomain_codesetফাংশন বেশ কয়েকবার ব্যবহার করা যাবে। যদি একই ডোমেননাম আর্গুমেন্টের সাথে একাধিকবার ব্যবহার করা হয় তবে পরবর্তী কলটি পূর্বের একটি দ্বারা তৈরি সেটিংসকে ওভাররাইড করে।

bind_textdomain_codesetফাংশন একটি স্ট্রিং নির্বাচিত codeset নাম রয়েছে এমন একটি পয়েন্টার ফেরৎ। স্ট্রিংটি ফাংশনে অভ্যন্তরীণভাবে বরাদ্দ করা হয় এবং ব্যবহারকারীর দ্বারা পরিবর্তন করা উচিত নয়। যদি কার্য সম্পাদনের সময় সিস্টেমটি মূল থেকে বাইরে চলে যায় তবে bind_textdomain_codeset, ফেরতের মান NULL হয় এবং বৈশ্বিক ভেরিয়েবল এরনো অনুসারে সেট করা থাকে।

আপনি স্থানীয় ইউনিকোড চরিত্রের বিভাগগুলিও ব্যবহার করতে পারেন , যা ভাষা স্বতন্ত্র এবং পুরোপুরি পসিক্স ক্লাসগুলি পূর্বে রাখতে পারে, বা সম্ভবত পূর্ববর্তীটির সাথে সংজ্ঞা দেওয়ার জন্য পর্যাপ্ত তথ্য সরবরাহ করার জন্য ফোন করতে পারে।

জটিলতার পাশাপাশি ইউনিকোড নতুন সম্ভাবনাও নিয়ে আসে। একটি হ'ল প্রতিটি ইউনিকোড অক্ষর একটি নির্দিষ্ট বিভাগের অন্তর্গত আপনি "অক্ষর" বিভাগের সাথে সম্পর্কিত একটি একক অক্ষরের সাথে মিল রাখতে পারেন \p{L}। আপনি এই বিভাগটির সাথে সম্পর্কিত নয় এমন একটি চরিত্রের সাথে মিল রাখতে পারেন \P{L}

আবার, "চরিত্র" এর অর্থ আসলে "ইউনিকোড কোড পয়েন্ট"। \p{L}"চিঠি" বিভাগে একক কোড পয়েন্টের সাথে মেলে। যদি আপনার ইনপুট স্ট্রিংটি à এনকোড থাকে তবে তা অ্যাকসেন্ট ছাড়াই U+0061 U+0300মেলে a। যদি ইনপুটটি হিসাবে àএনকোড থাকে তবে তা অ্যাকসেন্টের সাথে U+00E0মেলে à। কারণটি হ'ল উভয় কোড পয়েন্ট U+0061 (a)এবং U+00E0 (à)"চিঠি" বিভাগে রয়েছে, যখন U+0300"চিহ্ন" বিভাগে রয়েছে।

আপনার এখন বুঝতে হবে কেন \P{M}\p{M}*+এর সমতুল্য \X\P{M}এমন একটি কোড পয়েন্টের সাথে মেলে যা সংমিশ্রণমূলক চিহ্ন নয়, যখন \p{M}*+ শূন্য বা আরও বেশি কোড পয়েন্টগুলির সাথে মেলে যা চিহ্নগুলি সংযুক্ত করে। কোনও ডায়রিট্রিটিক্স সহ একটি চিঠি মিলাতে, ব্যবহার করুন \p{L}\p{M}*+। এটি àকীভাবে এনকোড করা হয়েছে তা নির্বিশেষে এই সর্বশেষ রেজেক্সটি সর্বদা মিলবে । অধিকারী কোয়ান্টিফায়ার নিশ্চিত করে যে ব্যাকট্র্যাকিংয়ের ফলে \P{M}\p{M}*+এটি অনুসরণ করে এমন সম্মিলনকারী চিহ্নগুলি ছাড়া কোনও অ-চিহ্নের সাথে মিলিত \X হতে পারে না যা কখনই না করে।

একই ওয়েবসাইটে যে উপরোক্ত তথ্য এও আলোচনা প্রদত্ত Tclর নিজস্ব POSIX -compliant Regex বাস্তবায়ন এখনও অন্য উপায় আপনার লক্ষ্য অর্জন হতে হতে পারে।

এবং সমাধানগুলির মধ্যে সর্বশেষে আমি পরামর্শ দেব যে আপনি 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টার্মিনাল হল UTF-8 ptyঅনুবাদ ডিভাইস আমি একটি কুট্নী ছাড়া 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নয় - তবে আপনি যেমন উপরে করেছেন ঠিক তেমন কাঁচা বিন্যাসটি পেতে পারেন:

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পৃষ্ঠাগুলি দেখতে বেশ সুন্দর দেখাচ্ছে। যাই হোক না কেন, কোনও কিছু আমাকে বলে যে আপনি পার্ল মডিউলকে কল করতে পেয়েছেন আমার চেয়ে কম কিছুটা কম কঠিন And এবং আবার, এটি আমার কম্পিউটারে ইতিমধ্যে ছিল - এবং আমি এমনকি পার্ল কখনও ব্যবহার করি না। এখানে উল্লেখযোগ্যভাবে কয়েকটি রয়েছে I18Nযে আমি পুরোপুরি ভাল করে জেনে আমি স্ক্রোল করেছিলাম যে আমি সেগুলিও কাজ করতে চাই না।


1
i18nএগুলি খুব সুন্দর এবং দরকারী তথ্য, তবে এটি উত্স ফাইলগুলিতে (ইন ) তথ্য দেয় যা আমি বর্তমানে যে লোকালটি ব্যবহার করছি তা তৈরি করতে ব্যবহৃত হতে পারে বা নাও হতে পারে। স্থানীয় তথ্য সম্ভবত থেকে এসেছে /usr/lib/locale/locale-archiveবা এসেছে /some/dir/LC_CTYPEএবং এটি আমার লোকালের সাথে সম্পর্কিত যা আমার পরে থাকা ফাইলগুলিতে সঞ্চিত থাকে।
স্টাফেন চেজেলাস

@ স্টাফেনচিজলস - সুতরাং LC_STUFFসংরক্ষণাগার থেকে কেবল এটি দিয়ে বের করুন localedef- এটিও তা করে। আমি এটিও ডেমো করতে পারি, আমার ধারণা। আপনি stringsবা এটির সাথে বা odবাকিগুলির যে কোনও কিছুই দেখতে পারেন । আমি করেছি, যাইহোক। তবে যাইহোক - বর্তমানে আপনার ব্যবহৃত লোকেলগুলি - এবং charmaps সেগুলি সম্পর্কেও localedefপ্রতিবেদন করবে। এছাড়াও কি recodeনা thats ।
মাইকজার্ভ

আপনি মূলত বলছেন যে সিস্টেমের গ্রন্থাগারগুলি ক্যোয়ারী চরিত্রের শ্রেণি সম্পর্কিত তথ্যগুলি যা করতে হবে তা আমরা হাতে হাতে করতে পারি, তবে এটি নির্ভরযোগ্যভাবে করতে হাজার হাজার লাইন কোডের প্রয়োজন হবে এবং ফলাফলটি সিস্টেম নির্দিষ্ট হবে। (সিস্টেম লাইব্রেরি ঠিক একইভাবে পরিবেশকে পার্সিং করছে (LOCPATH, LANG, ভাষা, LC_CTYPE ... ডেটা কোথায় সন্ধান করতে হবে তা সনাক্ত করুন, এটি নিষ্কাশন করুন ...)) সংরক্ষণাগার থেকে কীভাবে উপাদানগুলি বের করতে হবে তা আমি দেখতে পাচ্ছি না) localedef যদিও সঙ্গে।
Stéphane Chazelas

@StephaneChazelas - আমি আপনাকে হাত দ্বারা তা করার উপদেশ দিচ্ছি না - যেমন সিস্টেম বাইনেরিতে ব্যবহার করে - আমি তোমাকে একটা কম্পিউটারের সাথে এটা করতে সুপারিশ od, recode, uconvএবং বাকি। তবে এটি আমার ভুল ছিল - এটি localedefএটিকে উত্তোলন করে না, এটি recodeহবে। আপনার চেক আউট করতে হবে info recode- এবং recodeআমার দেখানো টেবিল কমান্ডের পাশাপাশি অনেকগুলি একই জিনিস রয়েছে - এবং এটি জিনিসগুলি একইভাবে পরিচালনা করবে, আমার ধারণা। এটি কেবল আপনার চরসেটটিকে পাতলা বাতাসের বাইরে টানবে না। যাই হোক না কেন আমি এই perlমডিউলগুলির জন্য উচ্চ প্রত্যাশা রেখেছিলাম - আপনি কি চেষ্টা করে দেখেছেন?
মাইকজার্ভ

1
যদি বর্তমান লোকালে প্রদত্ত একটি অক্ষর শ্রেণিতে অক্ষরের তালিকা পুনরুদ্ধার করার জন্য যদি একটি এপিআই থাকে, তবে এটি আমি বিশেষত যা খুঁজছি। আপনি যদি এটি কীভাবে প্রদর্শন করতে পারেন তবে আমি উত্তরটি গ্রহণ করব। আমি কেবল ভাবতে পারি (এবং কীভাবে আমি আমার প্রশ্নের "প্রত্যাশিত আউটপুট" পেয়েছি) তা হ'ল iswblank(3)সম্ভাব্য সমস্ত অক্ষরের মানগুলির জন্য ব্যবহার করা ।
স্টাফেন চেজেলাস

1

জিএনইউ, ফ্রিবিএসডি বা সোলারিস সিস্টেমে কমপক্ষে, এই ব্রুট-ফোর্স পদ্ধতির কাজ করে:

#include <wctype.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  unsigned long i;
  int need_init;
  wctype_t type;
  FILE* to_perl;

  setlocale(LC_ALL,"");
  if (argc != 2) {
    fprintf(stderr, "Usage: %s <type>\n", (argc?argv[0] : "???"));
    exit(1);
  }
  if (!(type = wctype(argv[1]))) {
    fprintf(stderr, "Invalid type: \"%s\"\n", argv[1]);
    exit(1);
  }

  need_init = wctomb(0, 0);

  to_perl = popen("perl -Mcharnames=full -ane '"
                  "printf \"%17s U+%04X %s\n\", join(\" \", @F[1..$#F]),"
                  "$F[0], charnames::viacode($F[0])'", "w");

#ifdef SUPPORT_ROGUE_LOCALES
  for(i=0; i<=0x7fffffff; i++) {
#else
  for(i=0; i<=0x10ffff; i++) {
    if (i == 0xd800) i = 0xe000; /* skip UTF-16 surrogates */
#endif
    if (iswctype(i, type)) {
      int n;
      unsigned char buf[1024];

      if (need_init) wctomb(0, 0);
      n = wctomb(buf, i);

      if (n > 0) {
        int c;
        fprintf(to_perl, "%lu", i);
        for (c = 0; c < n; c++)
          fprintf(to_perl, " %02X", buf[c]);
        putc('\n', to_perl);
      }
    }
  }
  pclose(to_perl);
  return 0;
}

সি / পসআইএক্স প্রতি, wchar_tএকটি অস্বচ্ছ ধরণের যা ইউনিকোডের সাথে কোনও সম্পর্কযুক্ত নয় এবং কেবলমাত্র সিস্টেমের লোকাল দ্বারা সমর্থিত সমস্ত অক্ষরকে আবৃত করার গ্যারান্টিযুক্ত, বাস্তবে, ইউনিকোড সমর্থনকারী বেশিরভাগ সিস্টেমে, মানগুলি ইউনিকোড কোড পয়েন্টের সাথে মিলে যায় এবং স্থানীয় সংজ্ঞাগুলি ইউনিকোডের উপর ভিত্তি করে।

ইউনিকোড বলতে সমস্ত পরিচিত অক্ষরগুলির সুপারস্টেট বোঝানো হয়, সুতরাং ইউনিকোডের সমস্ত বৈধ কোড পয়েন্ট (0 থেকে 0xD7FF এবং 0xE000 থেকে 0x10FFF) লুপ করা একটি প্রদত্ত অক্ষর দ্বারা সমর্থিত কমপক্ষে সমস্ত অক্ষর তালিকাভুক্ত করা উচিত।

এখানে, আমরা কোনও নির্দিষ্ট ধরণের কী তা পরীক্ষা করতে এবং এটিকে লোকেলের এনকোডিংয়ে তাদের এনকোডযুক্ত ফর্মে রূপান্তর করতে সিস্টেমের লোকাল স্ট্যান্ডার্ড এপিআই ব্যবহার করছি। আমরা কোনও ইউনিকোড কোডপয়েন্ট থেকে প্রদত্ত নামটি পেতে শুধুমাত্র perlএটির charnamesমডিউল ব্যবহার করি ।

আইসিও -2022-জেপির মতো রাষ্ট্রীয় এনকোডিংগুলি ব্যবহার করে এমন লোকেলগুলিতে, আমরা নিশ্চিত করে নিই যে এনকোডযুক্ত ফর্মটি ডিফল্ট প্রাথমিক অবস্থা থেকে প্রদর্শিত হয়েছে।

আমি এমন একটি সিস্টেম খুঁজে পাইনি যা একটি রাষ্ট্রীয় চরিত্রের এনকোডিং সহ লোকেলগুলি ইনস্টল করেছে তবে কমপক্ষে জিএনইউ সিস্টেমে এমন কিছু উত্পন্ন করা সম্ভব যাতে একটি দুর্বৃত্ত লোকেল তৈরি করা যায় (এবং কমপক্ষে জিএনইউ সরঞ্জামগুলি সেগুলিতে সঠিকভাবে কাজ করে না লোকেল)। উদাহরণস্বরূপ, একটি কাস্টম লোকেলের সাথে আইএসও -2022-জেপি ব্যবহার করে একটি সাধারণ ja_JPলোকেল পাওয়া যায়:

$ LOCPATH=$PWD LC_ALL=ja_JP.ISO-2022-JP ~/list-type blank
       09 U+0009 CHARACTER TABULATION
       20 U+0020 SPACE
   1B 24 42 21 21 U+3000 IDEOGRAPHIC SPACE

তুলনা করা:

$ LC_ALL=ja_JP.eucjp ~/list-type blank
       09 U+0009 CHARACTER TABULATION
       20 U+0020 SPACE
    A1 A1 U+3000 IDEOGRAPHIC SPACE

আইএসও -২২২২-জেপি-তে, 1B 24 42সিকোয়েন্স ( \e$B) ASCII থেকে এমন একটি রাজ্যে স্যুইচ করে যেখানে অক্ষরগুলিকে 2 (7-বিট) বাইট হিসাবে প্রকাশ করা হয় (এখানে আইডিজোগ্রাফিক স্পেসের 21 21)। EUCJP এ থাকাকালীন, এটি একই বাইটস তবে স্টেট স্যুইচিংটি 8 তম বিট ( A1 = 21 | 0x80) বিভক্ত করে তোলে যা এটি আরও রাষ্ট্রহীন করে তোলে।

এর অর্থ এই যে রাষ্ট্রীয় এনকোডিংগুলিতে প্রদত্ত চরিত্রটি লেখার বিভিন্ন উপায় রয়েছে (উদাহরণস্বরূপ state রাজ্যের স্যুইচিং সিক্যুয়েন্সগুলির বেশ কয়েকটি সন্নিবেশ করে ) এবং উপরের কোডটি দ্বারা প্রদর্শিত অনুক্রমটি কেবল তাদের মধ্যে একটি (প্রাথমিক থেকে আধ্যাত্মিক একটি) ডিফল্ট অবস্থা)।

একটি সাধারণ লোকেলের জন্য, দুর্বৃত্ত লোকেলের জন্য অক্ষরগুলি 0..0xD7FF, 0xE000..0x10FFFF এর বাইরে থাকতে পারে না, wchar_t দ্বারা সমর্থিত পরিসরের কোনও অক্ষর হতে পারে। উদাহরণস্বরূপ, আমি একটি লোকেল তৈরি করতে পারলাম যেখানে ইউ + ডিসিবিএ বা ইউ + 12345678 টি অক্ষর (বা তাদের অনুমতি থাকলে অক্ষর হবে) ফাঁকা থাকে । এজন্য আপনি সে কোডগুলি -D SUPPORT_ROGUE_LOCALESকভার করতে সেই কোডটি সংকলন করতে চান , যদিও এর অর্থ পুরো তালিকাটি স্ক্যান করতে আরও অনেক বেশি সময় লাগে।

আমি @ মাইকজার্ভের সমাধানটিকে recodeনিজের রূপান্তর হিসাবে ব্যবহার করতে পারি না , এটি আর রক্ষণাবেক্ষণ করা হয় না এবং কেবলমাত্র 0xFFFF পর্যন্ত ইউনিকোড অক্ষরকে সমর্থন করে এবং জিএনইউ trকমপক্ষে মাল্টি-বাইট অক্ষর দিয়ে কাজ করে না।

আমি ব্যবহার করতে পারি নি @ ChrisDown এর যেমন pythonPOSIX চরিত্র ক্লাস ইন্টারফেসগুলি নেই।

আমি পার্ল চেষ্টা করেছিলাম, তবে এটি ইউটিএফ -8 ব্যতীত মাল্টি-বাইট লোকেলের জন্য 128 এবং 255 এর মধ্যে কোড পয়েন্টের জন্য বোগাস এবং সিস্টেমটির রূপান্তর লাইব্রেরি ব্যবহার করে না।


আমি মনে করি এটি কার্যকরভাবে এটি করার একমাত্র উপায়, তবে আপনি আইনি কোডপয়েন্টের পরিসীমা সম্পর্কে সিদ্ধান্ত নিতে পূর্ববর্তী জ্ঞান ব্যবহার করেছেন এমনটি শুরু করে এটি বেশ কয়েকটি সমস্যার মধ্যে পড়ে। তত্ত্বের ক্ষেত্রে কমপক্ষে, আপনি যদি কোনও ইউনিকোড চারম্যাপ ব্যবহার করছেন তবে অক্ষর শ্রেণিগুলি স্ক্রিপ্টের থেকে পৃথক (ইউনিকোড স্ট্যান্ডার্ড অনুযায়ী সি লোকেল নয়), তবে ইউনিকোডের "সাধারণ বিভাগগুলি" সি অক্ষর শ্রেণীর মতো নয়। বিটিডাব্লু, গ্লিবসি'র আই 18 এন সিটিপগুলিতে আরও দুটি চরিত্রের ক্লাস রয়েছে: combiningএবং combining_level3(যেমন iswctype(i, wctype("combining")))
ধনী

@rici, সম্পাদনা দেখুন (এবং প্রশ্নটিও)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.