የሊኑክስ አይነት ሕብረቁምፊዎችን እንዴት እንደሚለይ

መግቢያ

ሁሉም ስለ አድራሻዎች መረጃን በማጣመር በአጭር ስክሪፕት ተጀምሯል። ኢ-ሜይል ከ HR ዳታቤዝ የተገኘ የሰራተኛ ቦታ ያላቸው ተጠቃሚዎች ከደብዳቤ መላኪያ ዝርዝር የተገኙ ሰራተኞች። ሁለቱም ዝርዝሮች ወደ ዩኒኮድ የጽሑፍ ፋይሎች ተልከዋል። በ UTF-8 እና በዩኒክስ መስመር መጨረሻዎች ተከማችቷል.

ይዘት mail.txt

ИванОв Андрей;[email protected]

ይዘት buhg.txt

Иванова Алла;маляр
Ёлкина Элла;крановщица
Иванов Андрей;слесарь
Абаканов Михаил;маляр

ለማዋሃድ ፋይሎቹ በዩኒክስ ትዕዛዝ ተደርድረዋል። ዓይነት እና ለዩኒክስ ፕሮግራም ግብአት ገብቷል። መቀላቀልሳይታሰብ በስህተቱ ያበቃው፡-

$> sort buhg.txt > buhg.srt
$> sort mail.txt > mail.srt
$> join buhg.srt mail.srt > result
join: buhg.srt:4: is not sorted: Иванов Андрей;слесарь

የመለየት ውጤቱን በአይኖች መመልከቱ በአጠቃላይ አመዳደሩ ትክክል ነው ፣ ግን በአጋጣሚ የወንድ እና የሴት ስሞችን በተመለከተ ሴቶቹ ከወንዶቹ ይቀድማሉ ።

$> sort buhg.txt
Абаканов Михаил;маляр
Ёлкина Элла;крановщица
Иванова Алла;маляр
Иванов Андрей;слесарь

በዩኒኮድ ውስጥ የመደርደር ችግር ወይም በአደራደር ስልተ ቀመር ውስጥ የሴትነት መገለጫ ይመስላል። የመጀመሪያው, በእርግጥ, የበለጠ ምክንያታዊ ነው.

ለአሁኑ እናስወግደው መቀላቀል እና ትኩረት ይስጡ ዓይነት. ችግሩን በሳይንሳዊ ፖክ ዘዴ ለመፍታት እንሞክር. መጀመሪያ አካባቢውን ከ en_us ላይ ru_RU. ለመደርደር የአካባቢን ተለዋዋጭ ማዘጋጀት በቂ ይሆናል LC_COLLATEነገር ግን በጥቃቅን ነገሮች ጊዜ አናባክንም።

$> LANG=ru_RU.UTF-8 sort buhg.txt
Абаканов Михаил;маляр
Ёлкина Элла;крановщица
Иванова Алла;маляр
Иванов Андрей;слесарь

ምንም አልተለወጠም።

ፋይሎቹን ወደ ነጠላ ባይት ኢንኮዲንግ ለመቀየር እንሞክር፡-

$> iconv -f UTF-8 -t KOI8-R buhg.txt 
 | LANG=ru_RU.KOI8-R sort 
 | iconv -f KOI8-R -t UTF8

እንደገና, ምንም ነገር አልተለወጠም.

ምንም ነገር ማድረግ አይቻልም, በይነመረብ ላይ መፍትሄ መፈለግ አለብዎት. ስለ ሩሲያኛ ስሞች በቀጥታ ምንም ነገር የለም ፣ ግን ስለ ሌሎች ያልተለመዱ ነገሮችን መለየት ጥያቄዎች አሉ። ለምሳሌ አንድ ችግር እዚህ አለ፡- unix ደርድር '-' (ሰረዝ) ቁምፊዎችን እንደ የማይታዩ አድርጎ ይመለከታል. ባጭሩ “ab”፣ “aa”፣ “ac” የሚባሉት ሕብረቁምፊዎች እንደ “አአ”፣ “ab”፣ “ac” ተደርድረዋል።

መልሱ በሁሉም ቦታ መደበኛ ነው፡ የፕሮግራም አድራጊውን አካባቢ ተጠቀም "ሐ" እና ደስተኛ ትሆናለህ. እንሞክራለን:

$> LANG=C sort buhg.txt
Ёлкина Элла;крановщица
Абаканов Михаил;маляр
Иванов Андрей;слесарь
Иванова Алла;адвокат

የሆነ ነገር ተቀይሯል። ኢቫኖቭስ በትክክለኛው ቅደም ተከተል ተሰልፏል, ምንም እንኳን ዮልኪና የሆነ ቦታ ቢንሸራተትም. ወደ ዋናው ችግር እንመለስ፡-

$> LANG=C sort buhg.txt > buhg.srt
$> LANG=C sort mail.txt > mail.srt
$> LANG=C join buhg.srt mail.srt > result

በበይነመረቡ ቃል በገባው መሰረት ያለምንም ስህተት ሰርቷል። እና ይህ በመጀመሪያው መስመር ላይ ዮልኪና ቢሆንም።

ችግሩ የተፈታ ይመስላል, ግን እንደዚያ ከሆነ, ሌላ የሩስያ ኢንኮዲንግ እንሞክር - ዊንዶውስ CP1251:

$> iconv -f UTF-8 -t CP1251 buhg.txt 
 | LANG=ru_RU.CP1251 sort 
 | iconv -f CP1251 -t UTF8 

የመደርደር ውጤቱ፣ በሚያስገርም ሁኔታ፣ ከአካባቢው ጋር ይዛመዳል "ሐ", እና ሙሉው ምሳሌ, በዚህ መሠረት, ያለ ስህተቶች ያልፋል. አንድ ዓይነት ሚስጥራዊ።

በፕሮግራም አወጣጥ ላይ ምስጢራዊነት አልወድም ምክንያቱም ብዙውን ጊዜ ስህተቶችን ስለሚሸፍን ነው። እንዴት እንደሚሰራ በቁም ነገር መነጋገር አለብን። ዓይነት እና ምን ተጽዕኖ ይኖረዋል LC_COLLATE .

በመጨረሻ ለጥያቄዎቹ መልስ ለመስጠት እሞክራለሁ-

  • ለምን የሴቶች ስሞች በስህተት እንደተደረደሩ
  • ለምን LANG=ru_RU.CP1251 ተመጣጣኝ ሆኖ ተገኝቷል LANG=C
  • ለምን አንተ ዓይነት и መቀላቀል ሾለ የተደረደሩ ረድፎች ቅደም ተከተል የተለያዩ ሀሳቦች
  • በሁሉም ምሳሌዎቼ ውስጥ ለምን ስህተቶች አሉ።
  • በመጨረሻም ገመዶችን ወደ መውደድዎ እንዴት መደርደር እንደሚቻል

በዩኒኮድ መደርደር

የመጀመሪያ ማቆሚያ ቴክኒካዊ ሪፖርት #10 ርዕስ ይሆናል። የዩኒኮድ ስብስብ አልጎሪዝም የመስመር ላይ ዩኒኮድ.org. ሪፖርቱ ብዙ ቴክኒካል ዝርዝሮችን ይዟል፣ስለዚህ ዋናዎቹን ሃሳቦች ማጠቃለያ ለመስጠት ነፃነትን እወስዳለሁ።

Collation - የሕብረቁምፊዎች "ንጽጽር" የማንኛውንም የመደርደር ስልተ ቀመር መሰረት ነው. ስልተ ቀመሮቹ እራሳቸው ሊለያዩ ይችላሉ ("አረፋ"፣ "መዋሃድ"፣ "ፈጣን")፣ ነገር ግን ሁሉም ቅደም ተከተላቸውን ለመወሰን የአንድ ጥንድ ሕብረቁምፊዎች ንፅፅር ይጠቀማሉ።

በተፈጥሮ ቋንቋ ሕብረቁምፊዎችን መደርደር በጣም ከባድ ችግር ነው። በጣም ቀላል በሆነው ነጠላ ባይት ኢንኮዲንግ ውስጥ እንኳን፣ በፊደላት ውስጥ ያሉ የፊደላት ቅደም ተከተል ፣ ምንም እንኳን ከእንግሊዝኛው የላቲን ፊደላት በተወሰነ ደረጃ የተለየ ቢሆንም ፣ እነዚህ ፊደሎች ከተቀመጡባቸው የቁጥር እሴቶች ቅደም ተከተል ጋር አይጣጣምም። ስለዚህ በጀርመን ፊደላት ፊደል Ö መካከል ይቆማል О и Pእና ኢንኮዲንግ ውስጥ CP850 መካከል ትወድቃለች። ÿ и Ü.

ከልዩ ኢንኮዲንግ ለማራገፍ መሞከር እና በዩኒኮድ እንደተደረገው በተወሰነ ቅደም ተከተል የተደረደሩትን "ሃሳባዊ" ፊደላት ግምት ውስጥ ማስገባት ትችላለህ። ኢንኮዲንግ UTF8, UTF16 ወይም ነጠላ ባይት KOI8-R (የተገደበ የዩኒኮድ ንኡስ ስብስብ አስፈላጊ ከሆነ) የፊደሎቹን የተለያዩ አሃዛዊ መግለጫዎችን ይሰጣል ነገር ግን ተመሳሳይ የጠረጴዛ ክፍሎችን ይመልከቱ።

ምንም እንኳን የምልክት ጠረጴዛን ከባዶ ብንገነባም ፣ ለእሱ ሁለንተናዊ ምልክት ትእዛዝ መስጠት አንችልም። ተመሳሳዩን ፊደላት በሚጠቀሙ የተለያዩ ብሄራዊ ፊደሎች ውስጥ የእነዚህ ፊደሎች ቅደም ተከተል ሊለያይ ይችላል። ለምሳሌ በፈረንሳይኛ Æ እንደ ጅማት እና እንደ ሕብረቁምፊ ይደረደራል AE. በኖርዌይ ቋንቋ Æ በኋላ የሚገኝ የተለየ ደብዳቤ ይሆናል Z. በነገራችን ላይ እንደ ጅማቶች ካልሆነ በስተቀር Æ ብዙ ቁምፊዎች ያሏቸው ፊደሎች አሉ። ስለዚህ በቼክ ፊደላት ውስጥ አንድ ፊደል አለ Chመካከል የቆመ H и I.

ከፊደል ልዩነት በተጨማሪ፣ የመደርደርን የሚነኩ ሌሎች ሀገራዊ ወጎች አሉ። በተለይም, ጥያቄው የሚነሳው: በመዝገበ-ቃላቱ ውስጥ አቢይ ሆሄያት እና ትንሽ ፊደላት ያካተቱ ቃላት በየትኛው ቅደም ተከተል መታየት አለባቸው? እንዲሁም መደርደር በሥርዓተ-ነጥብ ምልክቶች አጠቃቀም ልዩ ሁኔታዎች ሊጎዳ ይችላል። በስፓኒሽ፣ የተገለበጠ የጥያቄ ምልክት በጥያቄ ዓረፍተ ነገር መጀመሪያ ላይ ተቀምጧል (ሙዚቃ ትወዳለህ?). በዚህ ጉዳይ ላይ፣ የጥያቄ አረፍተ ነገሮች ከፊደል ውጭ በተለየ ክላስተር መመደብ እንደሌለባቸው ግልጽ ነው፣ ነገር ግን መስመሮችን በተለያዩ ሥርዓተ-ነጥብ እንዴት መደርደር እንደሚቻል?

ከአውሮፓውያን በተለየ ቋንቋ በሕብረቁምፊ አከፋፈል ላይ አላሰላስልም። ከቀኝ ወደ ግራ ወይም ከላይ እስከ ታች ያሉ ቋንቋዎች ቁምፊዎችን በመስመሮች ውስጥ በንባብ ቅደም ተከተል የማጠራቀም አዝማሚያ እንዳላቸው ልብ ይበሉ, እና ፊደል ያልሆኑ ስክሪፕቶች እንኳን መስመሮችን በቁምፊ ማዘዣ የራሳቸው መንገድ አላቸው. ለምሳሌ፣ ሃይሮግሊፍስ በቅጡ ማዘዝ ይቻላል (የቻይንኛ ቁምፊ ቁልፎች) ወይም በድምፅ አነጋገር። ስሜት ገላጭ ምስል እንዴት ማዘዝ እንዳለበት, በእውነቱ ምንም ሀሳብ የለኝም, ግን ለእነሱ የሆነ ነገር ማሰብ ይችላሉ.

ከላይ በተዘረዘሩት ባህሪያት ላይ በመመስረት, በዩኒኮድ ጠረጴዛዎች ላይ በመመስረት ሕብረቁምፊዎችን ለማነፃፀር ዋናዎቹ መስፈርቶች ተቀርፀዋል.

  • የሕብረቁምፊ ንጽጽር በኮድ ሠንጠረዥ ውስጥ ባሉ የቁምፊዎች አቀማመጥ ላይ የተመካ አይደለም;
  • ነጠላ ቁምፊን የሚፈጥሩ የቁምፊዎች ቅደም ተከተሎች ወደ ቀኖናዊው ቅፅ ይቀነሳሉ (A + የላይኛው ክበብ ተመሳሳይ ነው። Å);
  • ሕብረቁምፊዎችን ሲያወዳድሩ፣ ቁምፊ በሕብረቁምፊ አውድ ውስጥ ይታሰባል እና አስፈላጊ ከሆነ ከጎረቤቶች ጋር ወደ አንድ የንፅፅር አሃድ ይጣመራል (Ch በቼክ) ወይም ወደ ብዙ ተከፍሏል (Æ በፈረንሳይኛ);
  • ሁሉም ሀገራዊ ባህሪያት (ፊደል፣ አቢይ ሆሄያት፣ ሥርዓተ-ነጥብ ምልክቶች፣ የአጻጻፍ ዓይነቶች ቅደም ተከተል) እስከ ትእዛዝ (ኢሞጂ) በእጅ እስኪሰጡ ድረስ መዋቀር አለባቸው።
  • ንጽጽር ለመደርደር ብቻ ሳይሆን በሌሎች በርካታ ቦታዎችም አስፈላጊ ነው፡ ለምሳሌ፡ የሕብረቁምፊዎች ክልልን ለመለየት (በ{A ... z} ውስጥ በመተካት bash);
  • ንጽጽር በቂ ፈጣን መሆን አለበት.

በተጨማሪም የሪፖርቱ አዘጋጆች አልጎሪዝም ገንቢዎች ሊመኩበት የማይገባቸውን የንፅፅር ባህሪያትን ቀርፀዋል፡-

  • የንፅፅር ስልተ ቀመር ለእያንዳንዱ ቋንቋ የተለየ የቁምፊ ስብስብ አያስፈልገውም (የሩሲያ እና የዩክሬን ቋንቋዎች ብዙ ሲሪሊክ ቁምፊዎችን ይጋራሉ)።
  • ንጽጽሩ በዩኒኮድ ሠንጠረዦች የቁምፊዎች ቅደም ተከተል ላይ የተመሰረተ መሆን የለበትም;
  • በተለያዩ ባህላዊ አውዶች ውስጥ ያለው ተመሳሳይ ሕብረቁምፊ የተለያየ ክብደት ሊኖረው ስለሚችል የሕብረቁምፊው ክብደት የሕብረቁምፊው ባህሪ መሆን የለበትም።
  • የረድፍ ክብደቶች ሲዋሃዱ ወይም ሲከፋፈሉ ሊለወጡ ይችላሉ (ከ x < y ያንን አይከተልም። xz < yz);
  • ተመሳሳይ ክብደት ያላቸው የተለያዩ ሕብረቁምፊዎች ከመደርደር ስልተ ቀመር አንጻር እኩል ይቆጠራሉ። የእንደዚህ አይነት ሕብረቁምፊዎች ተጨማሪ ቅደም ተከተል ማስተዋወቅ ይቻላል, ነገር ግን አፈፃፀምን ሊያሳጣው ይችላል;
  • ተመሳሳይ ክብደት ያላቸው ረድፎች በተደጋጋሚ መደርደር ወቅት ሊለዋወጡ ይችላሉ. ጽናት የአንድ የተወሰነ የመደርደር ስልተ ቀመር ንብረት እንጂ የሕብረቁምፊ ንጽጽር አልጎሪዝም ንብረት አይደለም (የቀደመውን ነጥብ ይመልከቱ)።
  • ባህላዊ ልምምዶች ሲሻሻሉ/ ሲቀየሩ የመደርደር ደንቦች በጊዜ ሂደት ሊለወጡ ይችላሉ።

በተጨማሪም የንፅፅር ስልተ ቀመር ስለ ተቀነባበሩ ሕብረቁምፊዎች ትርጓሜ ምንም የሚያውቀው ነገር እንደሌለ ተደንግጓል። ስለዚህ ቁጥሮችን ብቻ ያካተቱ ሕብረቁምፊዎች ከቁጥሮች ጋር ሊወዳደሩ አይገባም, እና በእንግሊዝኛ ስሞች ዝርዝሮች ውስጥ, ጽሑፉ መወገድ የለበትም (ቢትልስ ፣ ዘ).

እነዚህን ሁሉ መስፈርቶች ለማሟላት፣ ባለብዙ ደረጃ (በእውነቱ ባለአራት-ደረጃ) የሰንጠረዥ መደርደር ስልተ ቀመር ቀርቧል።

ከዚህ ቀደም በሕብረቁምፊው ውስጥ ያሉት ቁምፊዎች ወደ ቀኖናዊ መልክ ይለወጣሉ እና ወደ ንጽጽር ክፍሎች ይመደባሉ. እያንዳንዱ የንፅፅር አሃድ ከበርካታ የንፅፅር ደረጃዎች ጋር የሚዛመዱ በርካታ ክብደቶች ይመደባሉ. የንፅፅር አሃዶች ክብደቶች የታዘዙ ስብስቦች (በዚህ ጉዳይ ላይ ኢንቲጀር) ብዙ ወይም ትንሽ ሊነፃፀሩ የሚችሉ አካላት ናቸው። ልዩ ትርጉም ችላ ተብሏል (0x0) ይህ ክፍል በንፅፅር ውስጥ በተመጣጣኝ የንፅፅር ደረጃ ላይ አይሳተፍም ማለት ነው. የሕብረቁምፊው ንጽጽር ተገቢውን ደረጃዎች ክብደት በመጠቀም ብዙ ጊዜ ሊደገም ይችላል. በእያንዳንዱ ደረጃ የሁለት ሕብረቁምፊዎች የንፅፅር አሃዶች ክብደቶች በቅደም ተከተል እርስ በርስ ይነፃፀራሉ.

ለተለያዩ ብሄራዊ ወጎች አልጎሪዝም በተለያዩ አተገባበር ውስጥ ፣ የቁጥር እሴቶች ሊለያዩ ይችላሉ ፣ ግን የዩኒኮድ ደረጃ መሰረታዊ የክብደት ሠንጠረዥን ያጠቃልላል - "ነባሪ የዩኒኮድ ስብስብ አባል ሰንጠረዥ" (DUCET). ተለዋዋጭውን ማቀናበሩን ልብ ማለት እፈልጋለሁ LC_COLLATE በሕብረቁምፊ ንጽጽር ተግባር ውስጥ የክብደት ሠንጠረዥ ምርጫን አመላካች ነው።

የክብደት መለኪያዎች DUCET እንደሚከተለው ተዘጋጅቷል.

  • በመጀመሪያ ደረጃ, ሁሉም ፊደሎች ወደ ተመሳሳይ ሁኔታ ይቀንሳሉ, የዲያክራቲክ ምልክቶች ይጣላሉ, ሥርዓተ-ነጥብ ምልክቶች (ሁሉም አይደሉም) ችላ ይባላሉ;
  • በሁለተኛው ደረጃ, ዳያክቲክስ ብቻ ግምት ውስጥ ይገባል;
  • ሦስተኛው ደረጃ ጉዳይ ብቻ ነው;
  • በአራተኛው ደረጃ, ሥርዓተ-ነጥብ ምልክቶች ብቻ ግምት ውስጥ ይገባሉ.

ንጽጽሩ በበርካታ ማለፊያዎች ውስጥ ይካሄዳል-በመጀመሪያ ደረጃ, የመጀመርያው ደረጃ መጋጠሚያዎች ይነጻጸራሉ; ክብደቶቹ የሚዛመዱ ከሆነ, ከሁለተኛው ደረጃ ክብደት ጋር እንደገና ይነጻጸራል; ከዚያም ምናልባት አንድ ሦስተኛ እና አራተኛ.

ንጽጽሩ የሚያበቃው ሕብረቁምፊዎቹ የተለያየ ክብደት ያላቸው ተዛማጅ የንጽጽር ክፍሎችን ሲይዙ ነው። በአራቱም ደረጃዎች እኩል ክብደት ያላቸው ረድፎች እርስ በእርሳቸው እኩል እንደሆኑ ይቆጠራሉ.

ይህ አልጎሪዝም (ከተጨማሪ ቴክኒካዊ ዝርዝሮች ስብስብ ጋር) #10 - ሪፖርት ለማድረግ ስም ሰጠው የዩኒኮድ ስብስብ አልጎሪዝም (ዩሲኤ).

ከኛ ምሳሌ የመደርደር ባህሪ ትንሽ ግልጽ የሚሆነው እዚህ ላይ ነው። ከዩኒኮድ ስታንዳርድ ጋር ማወዳደር ጥሩ ነው።

ለሙከራ አተገባበር ዩሲኤ ልዩ አለ ሙከራውበመጠቀም የክብደት ፋይል፣ በመገንዘብ DUCET. በክብደት መዝገብ ውስጥ የተለያዩ መዝናኛዎችን ማግኘት ይችላሉ። ለምሳሌ የማህጆንግ እና የአውሮፓ ዶሚኖዎች ቅደም ተከተል እንዲሁም በካርዶች ውስጥ የሱጥ ቅደም ተከተል አለ (ምልክት) 1F000 እና ተጨማሪ)። የካርድ ልብሶች በድልድዩ ደንቦች መሰረት ይቀመጣሉ - PCBT, እና በካርድ ካርዶች - በቅደም ተከተል T,2,3 ... K.

ትክክለኛ የሕብረቁምፊዎች መደርደር በእጅ ማረጋገጫ DUCET በጣም አሰልቺ ይሆናል ፣ ግን እንደ እድል ሆኖ ፣ ከዩኒኮድ ጋር ለመስራት የማጣቀሻ ቤተ-መጽሐፍት አተገባበር አለ - "ለዩኒኮድ ዓለም አቀፍ አካላት"(ICU).

በዚህ ቤተ-መጽሐፍት ቦታ ላይ፣ በ IBM, ጨምሮ ማሳያ ገጾች አሉ የሕብረቁምፊ ማነፃፀሪያ አልጎሪዝም ገጽ. የኛን የሙከራ ሕብረቁምፊዎች ከነባሪ ቅንጅቶች ጋር እናስገባለን እና፣እነሆ፣እነሆ፣የሩሲያኛ መደርደር ፍጹም የሆነውን እናገኛለን።

Абаканов Михаил;маляр
Ёлкина Элла;крановщица
Иванов Андрей;слесарь
Иванова Алла;адвокат

በነገራችን ላይ ድህረ ገጹ ICU ሥርዓተ-ነጥብ ምልክቶችን በሚሠሩበት ጊዜ የንጽጽር አልጎሪዝም ማሻሻያ ማግኘት ይችላሉ። በምሳሌዎች ውስጥ የስብስብ FAQ አፖስትሮፍ እና ሰረዝ ችላ ተብለዋል።

ዩኒኮድ ረድቶናል፣ ነገር ግን እንግዳ የሆኑ ባህሪያትን ምክንያቶች ፈልጉ ዓይነት в ሊኑክስ ወደ ሌላ ቦታ መሄድ አለበት.

በglibc በመደርደር ላይ

የመገልገያ ምንጭ ኮዶች ፈጣን እይታ ዓይነት ከ ጂኤንዩ ኮር መገልገያዎች በመገልገያው ራሱ ውስጥ, አካባቢያዊነት አሁን ያለውን ተለዋዋጭ እሴት ለማተም እንደሚቀንስ አሳይቷል LC_COLLATE በማረም ሁነታ ላይ ሲሄድ፡-

$ sort --debug buhg.txt > buhg.srt
sort: using ‘en_US.UTF8’ sorting rules

የሕብረቁምፊ ንጽጽር የሚከናወነው በመደበኛ ተግባር ነው። strcoll, ይህም ማለት ሁሉም ነገር የሚስብ በቤተ-መጽሐፍት ውስጥ ነው ግባ.

በ wiki ፕሮጀክት ግባ ለሕብረቁምፊ ንጽጽር የተሰጠ አንድ አንቀጽ. ከዚህ አንቀጽ መረዳት የሚቻለው ግባ መደርደር አስቀድሞ ለእኛ በሚታወቀው ስልተ ቀመር ላይ የተመሠረተ ነው። ዩሲኤ (የዩኒኮድ ስብስብ ስልተ ቀመር) እና/ወይም ለእሱ ቅርብ በሆነ መስፈርት ላይ አይኤስኦ 14651 (ዓለም አቀፍ ሕብረቁምፊ ማዘዝ እና ማወዳደር). የቅርብ ጊዜውን መስፈርት በተመለከተ በጣቢያው ላይ መሆኑን ልብ ሊባል ይገባል standards.iso.org አይኤስኦ 14651 በይፋ በይፋ ታውጇል፣ ግን ተዛማጁ ማገናኛ ወደማይኖር ገጽ ይመራል። ጉግል የደረጃውን የኤሌክትሮኒክ ቅጂ ለመቶ ዩሮ ለመግዛት ወደሚያቀርቡ ይፋዊ ገፆች አገናኞች ያላቸውን በርካታ ገፆችን ይሰጣል ነገርግን በፍለጋ ውጤቶቹ በሶስተኛው ወይም በአራተኛው ገፅ ላይ ቀጥታ አገናኞችም አሉ። ፒዲኤፍ. በአጠቃላይ, ደረጃው በተግባር አይለይም ዩሲኤ፣ ግን የበለጠ አሰልቺ ያነባል።

በጣም አስደሳች መረጃ wiki የሚያገናኝ ነበር። አጥፊ ውስጥ የሕብረቁምፊ ንፅፅር አተገባበር ውይይት ጋር ግባ. መሆኑን ከውይይቱ መረዳት ይቻላል። ግባ የሕብረቁምፊ ንጽጽር ጥቅም ላይ ይውላል አይኤስኦshnaya ጠረጴዛ የጋራ አብነት ሰንጠረዥ (CTT), አድራሻው በመተግበሪያው ውስጥ ሊገኝ ይችላል A መደበኛ አይኤስኦ 14651. በ 2000 እና 2015 መካከል ይህ ሰንጠረዥ በ ግባ ጠባቂ አልነበረውም እና (ቢያንስ በውጫዊ ሁኔታ) ከአሁኑ የደረጃው ስሪት በጣም የተለየ ነበር። ከ 2015 እስከ 2018 ፣ ከአዲሱ የጠረጴዛው ስሪት ጋር መላመድ ነበር ፣ እና በአሁኑ ጊዜ በእውነተኛው ህይወት ውስጥ እንደ አዲስ የጠረጴዛ ስሪት ለመገናኘት እድሉ አለዎት (CentOS 8) እና አሮጌው (CentOS 7).

አሁን ስለ አልጎሪዝም እና ረዳት ሰንጠረዦች ሁሉም መረጃዎች አሉን, ወደ መጀመሪያው ችግር እንመለሳለን እና በሩሲያ አከባቢ ውስጥ ገመዶችን እንዴት በትክክል መደርደር እንደሚቻል እንረዳለን.

ISO 14651 / 14652

እኛ ፍላጎት ያለው የሰንጠረዡ ምንጭ ኮድ CTT በአብዛኛዎቹ ስርጭቶች ላይ ሊኑክስ በማውጫው ውስጥ ነው /usr/share/i18n/አካባቢዎች/. ሠንጠረዡ ራሱ በፋይሉ ውስጥ ነው iso14651_t1_የጋራ. ከዚያ ይህ ፋይል መመሪያ ነው iso14651_t1_common ቅዳ በፋይሉ ውስጥ ተካትቷል iso14651_t1, እሱም በተራው, በብሔራዊ ፋይሎች ውስጥ የተካተተ, ጨምሮ en_us и ru_RU. በአብዛኛዎቹ ስርጭቶች ላይ ሊኑክስ ሁሉም የምንጭ ፋይሎች በመሠረታዊ ጭነት ውስጥ ተካትተዋል ፣ ግን ከሌሉ ፣ ከዚያ ተጨማሪ ጥቅል ከስርጭቱ መጫን አለብዎት።

የፋይል መዋቅር iso14651_t1 ስሞችን ለመገንባት ግልጽ ካልሆኑ ደንቦች ጋር በጣም ቃላታዊ ሊመስል ይችላል ፣ ግን ካወቁት ፣ ሁሉም ነገር በጣም ቀላል ነው። አወቃቀሩ በደረጃው ውስጥ ተገልጿል አይኤስኦ 14652, ቅጂው ከጣቢያው ሊወርድ ይችላል open-std.org. ሌላ የፋይል ቅርጸት መግለጫ በ ውስጥ ይገኛል። ዝርዝር መግለጫዎች POSIX от ክፍት ቡድን. ደረጃውን ለማንበብ እንደ አማራጭ, የተግባሩን ምንጭ ጽሑፎች ማጥናት ይችላሉ አንብብ в glibc/አካባቢ/ፕሮግራሞች/ld-collate.c.

የፋይል አወቃቀሩ ይህን ይመስላል።

በነባሪ፣ ቁምፊው እንደ ማምለጫ ቁምፊ ጥቅም ላይ ይውላል፣ እና ከ# ቁምፊው በኋላ ያለው የመስመሩ መጨረሻ አስተያየት ነው። ሁለቱም ምልክቶች እንደገና ሊገለጹ ይችላሉ, ይህም በአዲሱ የሠንጠረዡ ስሪት ውስጥ ይከናወናል.

escape_char /
comment_char %

ፋይሉ በቅርጸቱ ውስጥ ምልክቶችን ይይዛል ወይም (የት x ሄክሳዴሲማል አሃዝ ነው)። ይህ የዩኒኮድ ኮድ ነጥቦች ሄክሳዴሲማል ውክልና ነው። UCS-4 (በ UTF-32). ሁሉም ሌሎች ንጥረ ነገሮች በማእዘን ቅንፎች (በጨምሮ , ‹2> እና የመሳሰሉት) ከዐውደ-ጽሑፉ ብዙም ትርጉም የማይሰጡ እንደ ቀላል ሕብረቁምፊዎች ይቆጠራሉ።

መስመር LC_COLLATE የሕብረቁምፊ ንጽጽርን የሚገልጽ መረጃ ቀጥሎ እንደሚጀምር ይነግረናል።

በመጀመሪያ, ስሞች በንፅፅር ሠንጠረዥ ውስጥ ለክብደት እና ለቁምፊ ጥምረት ስሞች ተሰጥተዋል. በአጠቃላይ ሁለት አይነት ስሞች የሁለት የተለያዩ አካላት ናቸው ነገር ግን በእውነተኛው ፋይል ውስጥ ይደባለቃሉ። የክብደት ስሞች በቁልፍ ቃል ተሰጥተዋል የመሰብሰብ ምልክት (ንጽጽር ቁምፊ) ምክንያቱም ተመሳሳይ ክብደት ያላቸው የዩኒኮድ ቁምፊዎች ሲነጻጸሩ እንደ ተመጣጣኝ ቁምፊዎች ይቆጠራሉ.

አሁን ባለው የፋይሉ ክለሳ ውስጥ ያለው የክፍሉ አጠቃላይ ርዝመት 900 መስመሮች ነው። የዘፈቀደ ስሞችን እና በርካታ አይነት አገባቦችን ለማሳየት ከበርካታ ቦታዎች ምሳሌዎችን አነሳሁ።

LC_COLLATE

collating-symbol <RES-1>
collating-symbol <BLK>
collating-symbol <MIN>
collating-symbol <WIDE>
...
collating-symbol <ARABIC>
collating-symbol <ETHPC>
collating-symbol <OSMANYA>
...
collating-symbol <S1D000>..<S1D35F>
collating-symbol <SFFFF> % Guaranteed largest symbol value. Keep at end of this list
...
collating-element <U0413_0301> from "<U0413><U0301>"
collating-element <U0413_0341> from "<U0413><U0341>"

  • የመሰብሰብ ምልክት ሕብረቁምፊ ይመዘግባል ኦስማንያ በመጠን ስም ሰንጠረዥ ውስጥ
  • የመሰብሰብ ምልክት .. ቅድመ ቅጥያ ያለው የስም ቅደም ተከተል ይመዘግባል S እና ሄክሳዴሲማል የቁጥር ቅጥያ ከ 1D000 ወደ 1D35F.
  • ኤፍ ኤፍ ኤፍ в የመሰብሰብ ምልክት በሄክሳዴሲማል ውስጥ ትልቅ ያልተፈረመ ኢንቲጀር ይመስላል፣ ግን ሊመስል የሚችል ስም ብቻ ነው።
  • ስም በኮድ ነጥብ ማለት ነው። UCS-4
  • የመሰብሰቢያ አካል ከ" " ለጥንድ የዩኒኮድ ነጥቦች አዲስ ስም ይመዘግባል።

የክብደቶቹ ስሞች ከተገለጹ በኋላ ትክክለኛዎቹ ክብደቶች ይገለፃሉ. በንፅፅር ትልቅ-ያነሱ ሬሾዎች ብቻ ስለሆኑ፣ ክብደቶቹ የሚወሰኑት በቀላል ቅደም ተከተል ስሞች ነው። "ቀላል" ክብደቶች በመጀመሪያ ተዘርዝረዋል, ከዚያም "ከባድ" ክብደቶች. ለማስታወስ ያህል፣ እያንዳንዱ የዩኒኮድ ቁምፊ አራት የተለያዩ ክብደቶች ተሰጥቷል። እዚህ እነሱ በአንድ የታዘዘ ቅደም ተከተል ተጠቃለዋል. በንድፈ ሀሳብ፣ ማንኛውም ተምሳሌታዊ ስም በአራቱም ደረጃዎች ሊጠቅም ይችላል፣ ነገር ግን አስተያየቶቹ እንደሚያመለክቱት ገንቢዎቹ ስሞቹን በአእምሯዊ ደረጃ በደረጃ ይለያሉ።

% Symbolic weight assignments

% Third-level weight assignments
<RES-1>
<BLK>
<MIN>
<WIDE>
...
% Second-level weight assignments
<BASE>
<LOWLINE> % COMBINING LOW LINE
<PSILI> % COMBINING COMMA ABOVE
<DASIA> % COMBINING REVERSED COMMA ABOVE
...
% First-level weight assignments
<S0009> % HORIZONTAL TABULATION 
<S000A> % LINE FEED
<S000B> % VERTICAL TABULATION
...
<S0434> % CYRILLIC SMALL LETTER DE
<S0501> % CYRILLIC SMALL LETTER KOMI DE
<S0452> % CYRILLIC SMALL LETTER DJE
<S0503> % CYRILLIC SMALL LETTER KOMI DJE
<S0453> % CYRILLIC SMALL LETTER GJE
<S0499> % CYRILLIC SMALL LETTER ZE WITH DESCENDER
<S0435> % CYRILLIC SMALL LETTER IE
<S04D7> % CYRILLIC SMALL LETTER IE WITH BREVE
<S0454> % CYRILLIC SMALL LETTER UKRAINIAN IE
<S0436> % CYRILLIC SMALL LETTER ZHE

በመጨረሻም ትክክለኛው የክብደት ጠረጴዛ.

የክብደት ክፍሉ በቁልፍ ቃል መስመሮች ውስጥ ተዘግቷል ማዘዝ_ጀምር и ትእዛዝ_መጨረሻ. ተጨማሪ አማራጮች ማዘዝ_ጀምር በእያንዳንዱ የንፅፅር ደረጃ በየትኛው አቅጣጫ ረድፎች እንደሚቃኙ ይወስኑ. ነባሪው ቅንብር ነው። ወደፊት. የክፍሉ አካል የቁምፊ ኮድ እና አራት ክብደቶቹን የያዙ መስመሮችን ያካትታል. የቁምፊ ኮድ በቁምፊው በራሱ፣ በኮድ ነጥብ ወይም ቀደም ሲል በተገለጸው ምሳሌያዊ ስም ሊወከል ይችላል። ክብደቶች ለተምሳሌታዊ ስሞች፣ የኮድ ነጥቦች ወይም ምልክቶቹ እራሳቸው ሊሰጡ ይችላሉ። የኮድ ነጥቦች ወይም ቁምፊዎች ጥቅም ላይ ከዋሉ, ክብደታቸው ከኮድ ነጥቡ የቁጥር እሴት (በዩኒኮድ ሰንጠረዥ ውስጥ ያለው ቦታ) ጋር ተመሳሳይ ነው. በግልጽ ያልሆኑ ቁምፊዎች (እንደምረዳው) በዩኒኮድ ሠንጠረዥ ውስጥ ካለው አቀማመጥ ጋር የሚዛመድ ቀዳሚ ክብደት ለጠረጴዛው እንደተመደቡ ይቆጠራሉ። ልዩ የክብደት ዋጋ ቸል ይበሉ በተመጣጣኝ የንፅፅር ደረጃ የተሰጠው ገጸ ባህሪ ችላ ይባላል ማለት ነው.

የክብደቶችን አወቃቀር ለማሳየት ሶስት ግልጽ የሆኑ ቁርጥራጮችን መርጫለሁ-

  • ሙሉ በሙሉ ችላ የተባሉ ቁምፊዎች
  • በመጀመሪያዎቹ ሁለት ደረጃዎች ውስጥ ከሶስት ቁጥር ጋር እኩል የሆኑ ቁምፊዎች
  • የሳይሪሊክ ፊደላት መጀመሪያ ፣ ዲያክሪኮችን አልያዘም ፣ እና ስለሆነም በዋነኝነት በመጀመሪያ እና በሦስተኛው ደረጃዎች ይመደባሉ ።

order_start forward;forward;forward;forward,position
<U0000> IGNORE;IGNORE;IGNORE;IGNORE % NULL (in 6429)
<U0001> IGNORE;IGNORE;IGNORE;IGNORE % START OF HEADING (in 6429)
<U0002> IGNORE;IGNORE;IGNORE;IGNORE % START OF TEXT (in 6429)
...
<U0033> <S0033>;<BASE>;<MIN>;<U0033> % DIGIT THREE
<UFF13> <S0033>;<BASE>;<WIDE>;<UFF13> % FULLWIDTH DIGIT THREE
<U2476> <S0033>;<BASE>;<COMPAT>;<U2476> % PARENTHESIZED DIGIT THREE
<U248A> <S0033>;<BASE>;<COMPAT>;<U248A> % DIGIT THREE FULL STOP
<U1D7D1> <S0033>;<BASE>;<FONT>;<U1D7D1> % MATHEMATICAL BOLD DIGIT THREE
...
<U0430> <S0430>;<BASE>;<MIN>;<U0430> % CYRILLIC SMALL LETTER A
<U0410> <S0430>;<BASE>;<CAP>;<U0410> % CYRILLIC CAPITAL LETTER A
<U04D1> <S04D1>;<BASE>;<MIN>;<U04D1> % CYRILLIC SMALL LETTER A WITH BREVE
<U0430_0306> <S04D1>;<BASE>;<MIN>;<U04D1> % CYRILLIC SMALL LETTER A WITH BREVE
...
<U0431> <S0431>;<BASE>;<MIN>;<U0431> % CYRILLIC SMALL LETTER BE
<U0411> <S0431>;<BASE>;<CAP>;<U0411> % CYRILLIC CAPITAL LETTER BE
<U0432> <S0432>;<BASE>;<MIN>;<U0432> % CYRILLIC SMALL LETTER VE
<U0412> <S0432>;<BASE>;<CAP>;<U0412> % CYRILLIC CAPITAL LETTER VE
...
order_end

አሁን ከጽሁፉ መጀመሪያ ላይ ምሳሌዎችን ወደ መደርደር መመለስ ይችላሉ. ድብቁ በዚህ የክብደት ጠረጴዛው ክፍል ውስጥ ይገኛል-

<U0020> IGNORE;IGNORE;IGNORE;<U0020> % SPACE
<U0021> IGNORE;IGNORE;IGNORE;<U0021> % EXCLAMATION MARK
<U0022> IGNORE;IGNORE;IGNORE;<U0022> % QUOTATION MARK
...

በዚህ ሰንጠረዥ ውስጥ ከጠረጴዛው ላይ የስርዓተ-ነጥብ ምልክቶችን ማየት ይቻላል አስኪ ሕብረቁምፊዎችን ሲያወዳድሩ (ቦታን ጨምሮ) ሁልጊዜ ማለት ይቻላል ችላ ይባላል። ልዩ ሁኔታዎች በተዛማጅ ቦታዎች ላይ ከሚከሰቱት ሥርዓተ-ነጥብ ምልክቶች በስተቀር በሁሉም ነገር የሚጣጣሙ ሕብረቁምፊዎች ናቸው። የንፅፅር ስልተ ቀመር ከእኔ ምሳሌ (ከተደረደሩ በኋላ) መስመሮች ይህን ይመስላል።

АбакановМихаилмаляр
ЁлкинаЭллакрановщица
ИвановаАлламаляр
ИвановАндрейслесарь

በክብደት ሠንጠረዥ ውስጥ በሩሲያኛ አቢይ ሆሄያት ከትንሽ ሆሄያት በኋላ ይመጣሉ (በሶስተኛ ደረጃ የበለጠ ከባድ ), መደርደር ፍጹም ትክክል ይመስላል።

ተለዋዋጭ ሲያቀናብሩ LC_COLLATE=C ባይት ባይት ንጽጽርን የሚገልጽ ልዩ ሰንጠረዥ ተጭኗል

static const uint32_t collseqwc[] =
{
  8, 1, 8, 0x0, 0xff,
  /* 1st-level table */
  6 * sizeof (uint32_t),
  /* 2nd-level table */
  7 * sizeof (uint32_t),
  /* 3rd-level table */
  L'x00', L'x01', L'x02', L'x03', L'x04', L'x05', L'x06', L'x07',
  L'x08', L'x09', L'x0a', L'x0b', L'x0c', L'x0d', L'x0e', L'x0f',

...
  L'xf8', L'xf9', L'xfa', L'xfb', L'xfc', L'xfd', L'xfe', L'xff'
};

የዩኒኮድ ነጥብ Ё ከ A በፊት ስለሚመጣ፣ ገመዶቹም በዚሁ መሰረት ይደረደራሉ።

የጽሑፍ እና ሁለትዮሽ ሠንጠረዦች

በግልጽ ለማየት እንደሚቻለው የሕብረቁምፊ ንጽጽር እጅግ በጣም የተለመደ ክዋኔ ነው፣ እና ጠረጴዛን መተንተን CTT በጣም ውድ የሆነ አሰራር. የሠንጠረዡን ተደራሽነት ለማመቻቸት ከትእዛዙ ጋር ወደ ሁለትዮሽ መልክ ይጠናቀቃል localdef.

ቡድን localdef የብሔራዊ ባህሪያት ሰንጠረዥ ያለው ፋይል እንደ መለኪያዎች ይቀበላል (አማራጭ -i)፣ ሁሉም ቁምፊዎች በዩኒኮድ ነጥቦች የሚወከሉበት፣ እና የዩኒኮድ ነጥብ ካርታ ፋይል ለተወሰነ ኢንኮዲንግ ቁምፊዎች (አማራጭ) -f). በስራው ምክንያት, በመጨረሻው ግቤት ውስጥ ከተጠቀሰው ስም ጋር, ለአካባቢው ሁለትዮሽ ፋይሎች ይፈጠራሉ.

ግሊብክ ሁለት ሁለትዮሽ የፋይል ቅርጸቶችን ይደግፋል፡ "ባህላዊ" እና "ዘመናዊ"።

ተለምዷዊው ቅርጸት የአካባቢ ስም በ ውስጥ ንዑስ ማውጫ ስም መሆኑን ያመለክታል /usr/lib/አካባቢ/. ይህ ንዑስ ማውጫ ሁለትዮሾችን ይዟል LC_COLLATE, LC_CTYPE, LC_TIME እናም ይቀጥላል. ፋይል LC_IDENTIFICATION መደበኛውን የአካባቢ ስም (ከማውጫው ስም የተለየ ሊሆን ይችላል) እና አስተያየቶችን ይዟል.

ዘመናዊው ቅርጸት ሁሉንም አከባቢዎች በአንድ ማህደር ውስጥ ማከማቸትን ያካትታል /usr/lib/locale/locale-archive, ይህም በመጠቀም ሁሉም ሂደቶች ምናባዊ ትውስታ ላይ ካርታ ነው ግባ. በዘመናዊው ቅርፀት ውስጥ ያለው የአካባቢ ስም አንዳንድ ቀኖናዎችን ያካሂዳል - ቁጥሮች እና ፊደሎች ወደ ትናንሽ ፊደሎች የተቀነሱ ቁጥሮች ብቻ በምስጠራው ስም ይቀራሉ። ስለዚህ en_RU.KOI8-R, እንደ ይድናል ru_RU.koi8r.

የግቤት ፋይሎች አሁን ባለው ማውጫ ውስጥ፣ እንዲሁም በማውጫዎች ውስጥ ይፈለጋሉ። /usr/share/i18n/አካባቢዎች/ и /usr/share/i18n/charmaps/ ለፋይሎች CTT እና ፋይሎችን እንደቅደም ተከተል.

ለምሳሌ, ትዕዛዙ

localedef -i ru_RU -f MAC-CYRILLIC ru_RU.MAC-CYRILLIC

ፋይሉን ያጠናቅራል /usr/share/i18n/locales/ru_RU ኢንኮዲንግ ፋይልን በመጠቀም /usr/share/i18n/charmaps/MAC-CYRILLIC.gz እና ውጤቱን ያስቀምጡ /usr/lib/locale/locale-archive በስሙ ስር en_RU.ማሲሪሊክ

ተለዋዋጭ ካዘጋጁ LANG = en_US.UTF-8 ያንን ግባ በሚከተለው የፋይሎች እና ማውጫዎች ቅደም ተከተል የአካባቢ ሁለትዮሾችን ይፈልጋል።

/usr/lib/locale/locale-archive
/usr/lib/locale/en_US.UTF-8/
/usr/lib/locale/en_US/
/usr/lib/locale/enUTF-8/
/usr/lib/locale/en/

አንድ አከባቢ በሁለቱም ባህላዊ እና ዘመናዊ ቅርፀቶች ውስጥ ከተፈጠረ, ዘመናዊው ቅድሚያ የሚሰጠው ነው.

በትእዛዙ የተጠናቀሩ አከባቢዎችን ዝርዝር ማየት ይችላሉ የአካባቢ-ሀ.

የንፅፅር ጠረጴዛዎን በማዘጋጀት ላይ

አሁን፣ በእውቀት የታጠቁ፣ የእራስዎን ሃሳባዊ የሕብረቁምፊ ንጽጽር ጠረጴዛ መፍጠር ይችላሉ። ይህ ሠንጠረዥ Ёን ጨምሮ የሩስያ ፊደላትን በትክክል ማወዳደር አለበት እና በተመሳሳይ ጊዜ በሠንጠረዡ መሠረት ሥርዓተ-ነጥብ ምልክቶችን ግምት ውስጥ ማስገባት አለበት. አስኪ.

የእርስዎን የመደርደር ሰንጠረዥ የማዘጋጀት ሂደት ሁለት ደረጃዎችን ያቀፈ ነው-የክብደት ሠንጠረዥን ማስተካከል እና በትእዛዙ ወደ ሁለትዮሽ ማጠናቀር localdef.

የንጽጽር ጠረጴዛው በትንሹ የአርትዖት ወጪዎች እንዲስተካከል, በቅርጸት አይኤስኦ 14652 የነባር ሠንጠረዥን ክብደት ለማስተካከል ክፍሎች ተሰጥተዋል። ክፍል በቁልፍ ቃል ይጀምራል እንደገና ማዘዝ-በኋላ እና ተተኪው የሚከናወንበትን ቦታ በመግለጽ. ክፍሉን በመስመር ያበቃል እንደገና ይዘዙ-መጨረሻ. የሠንጠረዡን በርካታ ክፍሎች ማረም አስፈላጊ ከሆነ ለእያንዳንዱ እንደዚህ አይነት ክፍል አንድ ክፍል ይፈጠራል.

አዲሶቹን የፋይሎቹን ስሪቶች ገልብጫለሁ። iso14651_t1_የጋራ и ru_RU ከማከማቻው ግባ ወደ ቤትዎ ማውጫ ~/.local/share/i18n/locales/ እና ክፍሉን በትንሹ አርትዖት LC_COLLATE в ru_RU. አዲሶቹ የፋይሎች ስሪቶች ከእኔ ስሪት ጋር ሙሉ በሙሉ ተኳሃኝ ናቸው። ግባ. የቆዩ የፋይል ስሪቶችን ለመጠቀም ከፈለጉ በሠንጠረዡ ውስጥ ተምሳሌታዊ ስሞችን እና መተካት የሚጀምርበትን ቦታ መቀየር አለብዎት.

LC_COLLATE
% Copy the template from ISO/IEC 14651
copy "iso14651_t1"
reorder-after <U000D>
<U0020> <S0020>;<BASE>;<MIN>;<U0020> % SPACE
<U0021> <S0021>;<BASE>;<MIN>;<U0021> % EXCLAMATION MARK
<U0022> <S0022>;<BASE>;<MIN>;<U0022> % QUOTATION MARK
...
<U007D> <S007D>;<BASE>;<MIN>;<U007D> % RIGHT CURLY BRACKET
<U007E> <S007E>;<BASE>;<MIN>;<U007E> % TILDE
reorder-end
END LC_COLLATE

እንደ እውነቱ ከሆነ, መስኮችን መቀየር አስፈላጊ ይሆናል LC_IDENTIFICATION ወደ አካባቢው እንዲጠቁሙ en_MY, ግን በእኔ ምሳሌ ይህ አያስፈልግም ነበር, ምክንያቱም ማህደሩን ከአካባቢዎች ፍለጋ ስላገለልኩ የአካባቢ-መዝገብ ቤት.

ያ localdef በተለዋዋጭ በኩል በአቃፊዬ ውስጥ ካሉ ፋይሎች ጋር ሰርቷል። I18NPATH የግቤት ፋይሎችን ለመፈለግ ተጨማሪ ማውጫ ማከል ይችላሉ ፣ እና ሁለትዮሽዎችን ለማስቀመጥ ማውጫው ከቁጥቋጦዎች ጋር እንደ መንገድ ሊገለፅ ይችላል ።

$> I18NPATH=~/.local/share/i18n localedef -i ru_RU -f UTF-8 ~/.local/lib/locale/ru_MY.UTF-8

POSIX ውስጥ መሆኑን ይጠቁማል ላንግ ከአካባቢያዊ ፋይሎች ጋር ፍፁም ዱካዎችን ወደ ማውጫዎች መጻፍ ትችላለህ፣ ወደፊት slash ጀምሮ፣ ነገር ግን ግባ в ሊኑክስ ሁሉም ዱካዎች ከመሠረታዊ ማውጫ ውስጥ ተቆጥረዋል, ይህም በተለዋዋጭ ሊሻር ይችላል LOCPATH. ከተጫነ በኋላ LOCPATH=~/.local/lib/locale/ ከትርጉም ጋር የተያያዙ ሁሉም ፋይሎች የሚፈለጉት በእኔ አቃፊ ውስጥ ብቻ ነው። ተለዋዋጭ ሲዋቀር የአካባቢ ማህደር LOCPATH ችላ ተብሏል.

የመጨረሻው ፈተና እነሆ፡-

$> LANG=ru_MY.UTF-8 LOCPATH=~/.local/lib/locale/ sort buhg.txt
Абаканов Михаил;маляр
Ёлкина Элла;крановщица
Иванов Андрей;слесарь
Иванова Алла;адвокат

ሆሬ! አደረግነው!

አያያዝ ላይ ስህተት

ሕብረቁምፊዎችን መደርደርን በተመለከተ ለሚነሱት ጥያቄዎች ቀደም ሲል መልስ ሰጥቻቸዋለሁ፣በመጀመሪያ ላይ የተቀመጡት፣ነገር ግን አሁንም ስለስህተቶች ሁለት ጥያቄዎች አሉ - የሚታዩ እና የማይታዩ።

ወደ ዋናው ችግር እንመለስ።

እና ፕሮግራሙ ዓይነት እና ፕሮግራሙ መቀላቀል ተመሳሳይ የሕብረቁምፊ ንጽጽር ተግባራትን ከ ይጠቀሙ ግባ. ያ እንዴት ሆነ መቀላቀል በትእዛዙ በተደረደሩ መስመሮች ላይ የመደርደር ስህተት ሰጠ ዓይነት በአካባቢው en_US.UTF-8? መልሱ ቀላል ነው። ዓይነት መላውን ሕብረቁምፊ ያወዳድራል, እና መቀላቀል ቁልፉን ብቻ ያወዳድራል፣ እሱም በነባሪነት የሕብረቁምፊው መጀመሪያ እስከ መጀመሪያው ነጭ ቦታ ቁምፊ ​​ነው። በእኔ ምሳሌ ይህ የስህተት መልእክት አስከትሏል ምክንያቱም በመስመሮቹ ውስጥ የመጀመሪያዎቹ ቃላት መደርደር ሙሉ መስመሮችን ከመደርደር ጋር አይዛመድም።

አካባቢያዊ "ሐ" በተደረደሩት ሕብረቁምፊዎች ውስጥ፣ እስከ መጀመሪያው ቦታ ያሉት መሪ ንኡስ ሕብረቁምፊዎች እንደሚደረደሩ ዋስትና ይሰጣል፣ ነገር ግን ይህ ስህተቱን የሚሸፍነው ብቻ ነው። እንደነዚህ ያሉ መረጃዎችን (ተመሳሳይ ስሞች ያላቸው ሰዎች, ግን የተለያዩ ስሞች) ማንሳት ይቻላል, ይህም ያለ የስህተት መልእክት, ፋይሎችን በማዋሃድ የተሳሳተ ውጤት ያስገኛል. ከፈለግን መቀላቀል የተጣመሩ የፋይል መስመሮችን በሙሉ ስም፣ ያኔ ትክክለኛው መንገድ የመስክ መለያውን በግልፅ መለየት እና በቁልፍ መስክ መደርደር እንጂ በጠቅላላው መስመር አይደለም። በዚህ ሁኔታ, ውህደቱ በትክክል ይሰራል እና በማንኛውም አካባቢ ውስጥ ምንም ስህተቶች አይኖሩም.

$> sort -t ; -k 1 buhg.txt > buhg.srt
$> sort -t ; -k 1 mail.txt > mail.srt
$> join -t ; buhg.srt mail.srt > result

ኮድ የተደረገ ምሳሌ በተሳካ ሁኔታ ተፈጽሟል CP1251 ሌላ ስህተት ይዟል። እውነታው በእኔ የሚታወቅ በሁሉም ስርጭቶች ውስጥ ነው ሊኑክስ የተጠናቀረ አካባቢ ጠፍተዋል። en_RU.CP1251. የተጠናቀረው አካባቢ ካልተገኘ, ከዚያ ዓይነት በጸጥታ ባይት ባይት ንጽጽርን ይጠቀማል፣ ያ የተመለከትነው ነው።

በነገራችን ላይ, ከተቀናጁ አከባቢዎች ተደራሽ አለመሆን ጋር የተያያዘ ሌላ ትንሽ ብልሽት አለ. ቡድን LOCPATH=/tmp አካባቢ -a የሁሉም አከባቢዎች ዝርዝር ይመልሳል የአካባቢ-መዝገብ ቤት, ነገር ግን ከተለዋዋጭ ስብስብ ጋር LOCPATH ለሁሉም ፕሮግራሞች (አብዛኞቹን ጨምሮ) አካባቢያዊ) እነዚህ አካባቢዎች አይገኙም።

$> LOCPATH=/tmp locale -a | grep en_US
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8

$> LC_COLLATE=en_US.UTF-8 sort --debug
sort: using ‘en_US.UTF-8’ sorting rules

$> LOCPATH=/tmp LC_COLLATE=en_US.UTF-8 sort --debug
sort: using simple byte comparison

መደምደሚያ

ሕብረቁምፊዎች የባይት ስብስብ ናቸው ብሎ ለማሰብ የለመዱ ፕሮግራመር ከሆንክ ምርጫህ ነው። LC_COLLATE=C.

የቋንቋ ሊቅ ወይም መዝገበ ቃላት አቀናባሪ ከሆንክ የአካባቢህን ብታጠናቅቅ ይሻልሃል።

ቀላል ተጠቃሚ ከሆንክ ትእዛዙን በትክክል መጠቀም አለብህ ls-a በደብዳቤ የሚጀምሩ ፋይሎችን በነጥብ የተጠላለፉ ፋይሎችን ያትማል እና የእኩለ ሌሊት አዛዥስሞችን ለመደርደር የውስጥ ተግባራቶቹን የሚጠቀም ፋይሎችን በነጥብ ጀምሮ ወደ ዝርዝሩ ፊት ያንቀሳቅሳል።

ማጣቀሻዎች

ሪፖርት #10 የዩኒኮድ ስብስብ አልጎሪዝም

የቁምፊ ክብደቶች በ unicode.org

ICU - ከ IBM ከዩኒኮድ ጋር አብሮ ለመስራት የቤተ-መጽሐፍት አተገባበር.

ሙከራን በመደርደር ላይ ICU

የገጸ ባህሪ ክብደቶች አይኤስኦ 14651

የልኬት ፋይል ቅርጸት መግለጫ አይኤስኦ 14652

የሕብረቁምፊ ንጽጽር ውይይት በ ግባ

ምንጭ: hab.com

አስተያየት ያክሉ