Conas a shórtáil Linux teaghráin

Réamhrá

Thosaigh sé ar fad le script ghearr a bhí ceaptha chun faisnéis seoltaí a chur le chéile ríomhphost fostaithe a fuarthas ó liosta úsáideoirí an liosta seoltaí, agus poist fostaithe faighte ó bhunachar sonraí na Roinne AD. Easpórtáladh an dá liosta go comhaid téacs Unicode UTF-8 agus a shábháil le deirí líne Unix.

Ábhar ríomhphost.txt

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

Ábhar buhg.txt

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

Chun cumasc, rinneadh na comhaid a shórtáil de réir ordú Unix saghas agus cuireadh isteach chuig ionchur chlár Unix páirt a ghlacadh, a theip gan choinne le hearráid:

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

Nuair a bhreathnaíonn tú ar an sórtáil le do shúile thaispeáin sé go bhfuil an sórtáil ceart go ginearálta, ach i gcás comhtharlúint sloinnte fireanna agus baineanna, tagann na baineanna roimh na cinn fireanna:

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

Is cosúil le glitch sórtála in Unicode nó mar léiriú ar fheimineachas san algartam sórtála. Tá an chéad cheann, ar ndóigh, níos sochreidte.

A ligean ar é a chur amach ar feadh tamaill páirt a ghlacadh agus díriú ar saghas. Déanaimis iarracht an fhadhb a réiteach ag baint úsáide as poking eolaíoch. Ar dtús, déanaimis an locale a athrú ó i U.S ar ru_RU. Le sórtáil, ba leor an athróg timpeallachta a shocrú LC_COLLATE, ach ní chuirfimid am amú ar trifles:

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

Ní dhéanfaidh aon ní athrú.

Déanaimis iarracht na comhaid a athchódú in ionchódú aon bheart:

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

Arís níl aon athrú.

Níl aon rud is féidir leat a dhéanamh, beidh ort teacht ar réiteach ar an Idirlíon. Níl aon rud go díreach faoi shloinnte na Rúise, ach tá ceisteanna ann faoi aisteach sórtála eile. Mar shampla, seo fadhb: déileálann unix sort '-' (dash) carachtair mar dofheicthe. I mbeagán focal, déantar na teaghráin "ab", "aa", "ac" a shórtáil mar "aa", "ab", "ac".

Tá an freagra caighdeánach i ngach áit: bain úsáid as locale an ríomhchláraitheora "C" agus beidh tú sásta. Déanaimis iarracht:

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

Tá rud éigin athraithe. Tháinig na Ivanovs san ord ceart, cé gur shleamhnaigh Yolkina áit éigin. Fillfimid ar an bhfadhb bhunaidh:

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

D'oibrigh sé gan earráidí, mar a gheall an Idirlíon. Agus seo in ainneoin Yolkina sa chéad líne.

Is cosúil go bhfuil an fhadhb le réiteach, ach ar eagla na heagla, déanaimis iarracht ionchódú Rúisis eile - Windows CP1251:

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

Corruair go leor beidh an toradh sórtála ag teacht leis an locale "C", agus an sampla iomlán, dá réir sin, ritheann gan earráidí. Cineál éigin de misteachas.

Ní maith liom misteachas i gcláir mar is gnách go gceileann sé botúin. Beidh orainn breathnú go dáiríre ar conas a oibríonn sé. saghas agus cad a dhéanann sé difear? LC_COLLATE .

Ag an deireadh déanfaidh mé iarracht na ceisteanna a fhreagairt:

  • cén fáth ar sórtáladh sloinnte ban go mícheart?
  • cén fáth LANG=ru_RU.CP1251 iompaigh amach a bheith comhionann LANG=C
  • cén fáth a dhéanamh saghas и páirt a ghlacadh smaointe éagsúla faoi ord na teaghráin sórtáilte
  • cén fáth a bhfuil earráidí i mo chuid samplaí go léir?
  • ar deireadh conas teaghráin a shórtáil de réir mar is maith leat

Sórtáil in Unicode

Is é Tuarascáil Theicniúil Uimh. 10 dar teideal an chéad stad Algartam tiomsaithe Unicode ar líne unicode.org. Tá go leor sonraí teicniúla sa tuarascáil, mar sin lig dom achoimre ghairid a thabhairt ar na príomh-smaointe.

Cóimheas — is é "comparáid" teaghráin an bonn d'aon algartam sórtála. Féadfaidh na halgartaim iad féin a bheith difriúil ("mboilgeog", "cumasc", "tapa"), ach úsáidfidh siad go léir comparáid idir péire teaghráin chun an t-ord ina bhfuil siad le feiceáil a chinneadh.

Fadhb sách casta is ea teaghráin a shórtáil i dteanga nádúrtha. Fiú amháin sna hionchóduithe aon bheart is simplí, ní bheidh ord na litreacha san aibítir, fiú ar bhealach éigin difriúil ón aibítir Laidineach Béarla, ag teacht le hord na luachanna uimhriúla lena n-ionchódaítear na litreacha seo. Mar sin in aibítir na Gearmáine an litir Ö sheasann idir О и P, agus san ionchódú CP850 faigheann sí idir ÿ и Ü.

Is féidir leat triail a bhaint as ionchódú ar leith agus machnamh a dhéanamh ar litreacha “idéalacha” atá eagraithe in ord éigin, mar a dhéantar in Unicode. Ionchóduithe UTF8, UTF16 nó beart amháin KOI8-R (má tá gá le fothacar teoranta de Unicode) léiriúcháin uimhriúla éagsúla de litreacha a thabhairt, ach déanfaidh sé tagairt do na gnéithe céanna den tábla bonn.

Tharlaíonn sé go raibh fiú má thógaimid tábla siombailí ó thús, ní bheidh muid in ann ordú siombail uilíoch a shannadh dó. In aibítir náisiúnta éagsúla a úsáideann na litreacha céanna, féadfaidh ord na litreacha seo a bheith difriúil. Mar shampla, i bhFraincis Æ a mheas mar ligature agus a shórtáil mar teaghrán AE. I Ioruais Æ beidh litir ar leith, atá suite i ndiaidh Z. Dála an scéil, chomh maith le ligatures mhaith Æ Tá litreacha scríofa le siombailí éagsúla. Mar sin in aibítir na Seice tá litir Ch, a sheasann idir H и I.

Chomh maith le difríochtaí sna haibítrí, tá traidisiúin náisiúnta eile ann a mbíonn tionchar acu ar shórtáil. Éiríonn an cheist ach go háirithe: cén t-ord ar cheart focail a bhfuil litreacha móra agus litreacha beaga iontu a bheith san fhoclóir? D’fhéadfadh tionchar a bheith ag úsáid marcanna poncaíochta ar an sórtáil freisin. Sa Spáinnis, úsáidtear comhartha ceiste inbhéartaithe ag tús abairte ceisteach (An maith leat ceol?). Sa chás seo, is léir nár cheart abairtí ceisteacha a ghrúpáil i gcnuasach ar leith lasmuigh den aibítir, ach conas línte a shórtáil le marcanna poncaíochta eile?

Ní bheidh mé ag dul i muinín teaghráin a shórtáil i dteangacha atá an-difriúil ó na cinn Eorpacha. Tabhair faoi deara, i dteangacha a bhfuil treo scríbhneoireachta ceart go clé nó ó bharr go bun, is dóichí go stórálfar carachtair i línte in ord léitheoireachta, agus fiú go bhfuil a mbealaí féin ag córais scríbhneoireachta neamh-aibítreacha chun línte a ordú de réir carachtair. . Mar shampla, is féidir hieroglyphs a ordú de réir stíl (Eochracha carachtair Sínis) nó le fuaimniú. Le bheith macánta, níl aon smaoineamh agam conas ba cheart emojis a shocrú, ach is féidir leat teacht ar rud éigin dóibh freisin.

Bunaithe ar na gnéithe a liostaítear thuas, foirmíodh na bunriachtanais chun teaghráin a chur i gcomparáid bunaithe ar tháblaí Unicode:

  • ní bhraitheann comparáid idir teaghráin ar shuíomh na gcarachtar sa tábla cóid;
  • laghdaítear seichimh charachtair a fhoirmíonn aon charachtar amháin go foirm chanónach (A + is ionann an ciorcal uachtarach agus Å);
  • Nuair a dhéantar comparáid idir teaghráin, déantar carachtar a mheas i gcomhthéacs na téad agus, más gá, é a chomhcheangal lena chomharsana in aonad comparáide amháin (Ch sa tSeicis) nó tá sé roinnte ina roinnt (Æ sa Fhraincis);
  • ní mór gach gné náisiúnta (aibítir, cás uachtair/cás íochtair, poncaíocht, ord na scríbhneoireachta) a chumrú suas go dtí sannadh an oird de láimh (emoji);
  • tá comparáid tábhachtach, ní hamháin maidir le sórtáil, ach freisin i go leor áiteanna eile, mar shampla chun raonta rónna a shonrú (cuir {A... z} in ionad Eabhrac);
  • ba chóir an chomparáid a dhéanamh go measartha tapa.

Ina theannta sin, cheap údair na tuarascála airíonna comparáide nár cheart d’fhorbróirí algartam brath orthu:

  • níor cheart go n-éileodh an t-algartam comparáide sraith carachtar ar leith do gach teanga (is i dteangacha na Rúise agus na hÚcráine an chuid is mó de na carachtair Choireallacha);
  • níor cheart go mbeadh an chomparáid ag brath ar ord na gcarachtar i dtáblaí Unicode;
  • níor cheart go mbeadh meáchan teaghrán ina tréith den téad, toisc gur féidir meáchain éagsúla a bheith ag an téad chéanna i gcomhthéacsanna cultúrtha éagsúla;
  • is féidir meáchain rónna a athrú nuair a dhéantar cumasc nó scoilteadh (ó x < y ní leanann sé sin xz < yz);
  • meastar teaghráin éagsúla a bhfuil na meáchain chéanna acu a bheith comhionann ó thaobh an algartam sórtála de. Is féidir teaghráin den sórt sin a ordú breise a thabhairt isteach, ach féadfaidh sé an fheidhmíocht a dhíghrádú;
  • Le linn sórtála arís agus arís eile, féadfar sraitheanna leis na meáchain chéanna a mhalartú. Is airí de chuid algartam sórtála ar leith é daingneacht, agus ní airí de chuid algartam comparáide teaghráin (féach an mhír roimhe seo);
  • D’fhéadfadh go n-athróidh rialacha sórtála le himeacht ama de réir mar a thagann athrú ar thraidisiúin chultúrtha.

Tá sé ordaithe freisin nach bhfuil a fhios ag an algartam comparáide rud ar bith faoi shéimeantaic na teaghráin atá á bpróiseáil. Mar sin, níor cheart teaghráin nach bhfuil iontu ach digití a chur i gcomparáid mar uimhreacha, agus i liostaí d'ainmneacha Béarla an t-alt (Beatles, an).

Chun na ceanglais shonraithe go léir a shásamh, moltar algartam sórtála tábla il-leibhéil (i ndáiríre ceithre leibhéal).

Roimhe seo, laghdaítear na carachtair sa téad go foirm chanónach agus grúpáiltear iad in aonaid chomparáide. Sanntar roinnt meáchain a fhreagraíonn do leibhéil éagsúla comparáide do gach aonad comparáide. Is gnéithe de thacair ordaithe iad meáchain na n-aonad comparáide (sa chás seo, slánuimhreacha) ar féidir iad a chur i gcomparáid ar feadh níos mó nó níos lú. Brí speisialta AR AGHAIDH (0x0) nach bhfuil baint ag an aonad seo leis an gcomparáid ag an leibhéal comparáide comhfhreagrach. Is féidir comparáid idir teaghráin a dhéanamh arís agus arís eile, ag baint úsáide as meáchain na leibhéal comhfhreagrach. Ag gach leibhéal, déantar meáchain na n-aonad comparáide de dhá shraith a chur i gcomparáid go seicheamhach lena chéile.

I bhfeidhmiúcháin éagsúla an algartam do thraidisiúin náisiúnta éagsúla, féadfaidh luachanna na gcomhéifeachtaí a bheith difriúil, ach cuimsíonn caighdeán Unicode tábla meáchain bunúsach - "Tábla Réamhshocraithe Comhdhlúthaithe Unicode" (DUCET). Ba mhaith liom a thabhairt faoi deara go bhfuil socrú an athróg LC_COLLATE is léiriú é iarbhír ar roghnú an tábla meáchain san fheidhm chomparáide teaghrán.

Comhéifeachtaí ualaithe DUCET socraithe mar seo a leanas:

  • ag an gcéad leibhéal, laghdaítear gach litir go dtí an cás céanna, cuirtear diacritics i leataobh, ní thugtar aird ar mharcanna poncaíochta (ní léir);
  • ag an dara leibhéal, ní chuirtear san áireamh ach diacriticí;
  • ar an tríú leibhéal, ní chuirtear san áireamh ach cás;
  • ag an gceathrú leibhéal, ní chuirtear san áireamh ach marcanna poncaíochta.

Déantar an chomparáid i roinnt pasanna: ar dtús, déantar comparáid idir comhéifeachtaí an chéad leibhéil; má thagann na meáchain i gcomhthráth, déantar comparáid arís agus arís eile leis na meáchain dara leibhéal; ansin b'fhéidir an tríú agus an ceathrú.

Críochnaíonn an chomparáid nuair a bhíonn aonaid chomhoiriúnaithe le meáchain éagsúla sna sraitheanna. Meastar go bhfuil sraitheanna a bhfuil na meáchain chéanna acu ar na ceithre leibhéal ar fad cothrom lena chéile.

Thug an t-algartam seo (le roinnt sonraí teicniúla breise) an t-ainm le tuairisc Uimh. 10 - "Algartam Comhthiomsaithe Unicode" (ACU).

Seo nuair a éiríonn an t-iompar sórtála ónár sampla beagán níos soiléire. Bheadh ​​sé go deas é a chur i gcomparáid leis an gcaighdeán Unicode.

Chun feidhmiúcháin a thástáil ACU tá speisialta ann тест, ag baint úsáide as comhad meáchain, ag cur i bhfeidhm DUCET. Is féidir leat gach cineál rudaí greannmhar a fháil sa chomhad scálaí. Mar shampla, tá ord mahjong agus dúradáin Eorpacha, chomh maith le hord na n-oireann i deic cártaí (siombail 1F000 agus a thuilleadh). Cuirtear oireann na gcártaí de réir rialacha an droichid - PCBT, agus tá na cártaí san chulaith sa seicheamh T, 2,3, XNUMX ... K.

Seiceáil de láimh go bhfuil na sraitheanna curtha in eagar i gceart de réir DUCET a bheith tedious go leor, ach, go fortunately dúinn, tá cur i bhfeidhm eiseamláireach sa leabharlann maidir le bheith ag obair le Unicode - "Comhpháirteanna Idirnáisiúnta do Unicode"(ICU).

Ar shuíomh Gréasáin na leabharlainne seo, a forbraíodh i IBM, tá leathanaigh taispeána ann, lena n-áirítear leathanach algartam comparáide teaghrán. Cuirimid ár línte tástála isteach le socruithe réamhshocraithe agus, féach, a fháil againn sórtáil Rúisis foirfe.

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

Dála an scéil, an láithreán gréasáin ICU Is féidir leat soiléiriú a fháil ar an algartam comparáide agus tú ag próiseáil marcanna poncaíochta. I samplaí Ceisteanna Coitianta maidir le Comhthiomsú déantar neamhaird ar an aspal agus ar an fleiscín.

Chuidigh Unicode linn, ach lorg cúiseanna le hiompar aisteach saghas в Linux beidh orthu dul áit éigin eile.

Sórtáil i glibc

Amharc tapa ar na cóid foinse fóntais saghas de GNU Core Utils léirigh go mbaineann logánú leis an bhfóntas féin chun luach reatha na hathróige a phriontáil LC_COLLATE agus tú ag rith i mód dífhabhtaithe:

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

Déantar comparáidí teaghrán ag baint úsáide as an bhfeidhm chaighdeánach strcoll, rud a chiallaíonn go bhfuil gach rud suimiúil sa leabharlann glibc.

Ar wiki an tionscadal glibc tiomanta do chomparáid teaghrán alt amháin. Ón mír seo is féidir a thuiscint go bhfuil i glibc tá an sórtáil bunaithe ar algartam atá ar eolas againn cheana féin ACU (An t-algartam tiomsaithe Unicode) agus/nó ar chaighdeán gar dó ISO 14651 (Ordú teaghrán idirnáisiúnta agus comparáid a dhéanamh). Maidir leis an gcaighdeán is déanaí, ba chóir a thabhairt faoi deara go bhfuil ar an suíomh caighdeáin.iso.org ISO 14651 dearbhaithe go hoifigiúil ar fáil go poiblí, ach tá an nasc comhfhreagrach mar thoradh ar leathanach nach bhfuil ann. Tugann Google roinnt leathanach ar ais le naisc chuig láithreáin oifigiúla a thairgeann cóip leictreonach den chaighdeán a cheannach ar céad euro, ach ar an tríú nó an ceathrú leathanach de thorthaí cuardaigh tá naisc dhíreacha freisin chuig PDF. Go ginearálta, tá an caighdeán beagnach aon difriúil ó ACU, ach tá sé níos leadránach le léamh toisc nach bhfuil samplaí soiléire ann de ghnéithe náisiúnta den sórtáil sreangán.

An t-eolas is suimiúla ar wiki bhí nasc chuig lorgaire fabht le plé ar chur i bhfeidhm comparáide teaghrán i glibc. Ón bplé is féidir a fhoghlaim go glibc a úsáidtear chun teaghráin a chur i gcomparáid ISOtábla pearsanta An Tábla Teimpléad Coiteann (CTT), a bhfuil a seoladh le fáil san iarratas A caighdeánach ISO 14651. Idir 2000 agus 2015 an tábla seo i glibc ní raibh cothaitheoir aige agus bhí sé an-difriúil (go seachtrach ar a laghad) ón leagan reatha den chaighdeán. Ó 2015 go 2018, rinneadh oiriúnú don leagan nua den tábla, agus anois tá deis agat bualadh le chéile i saol fíor leagan nua den tábla (8 CentOS), agus sean (7 CentOS).

Anois go bhfuil an fhaisnéis go léir againn faoin algartam agus na táblaí cúnta, is féidir linn filleadh ar an bhfadhb bunaidh agus tuiscint a fháil ar conas teaghráin a shórtáil i gceart i locale na Rúise.

ISO 14651 / 14652

Cód foinse an tábla a bhfuil suim againn ann CTT ar an gcuid is mó dáileacháin Linux atá san eolaire /usr/share/i18n/áiteanna/. Tá an tábla féin sa chomhad iso14651_t1_coitianta. Ansin is é seo an treoir comhad cóip iso14651_t1_common san áireamh sa chomhad iso14651_t1, a chuimsítear, ar a seal, i gcomhaid náisiúnta, lena n-áirítear i U.S и ru_RU. Ar an chuid is mó dáileacháin Linux Tá gach comhad foinse san áireamh sa suiteáil bhunúsach, ach mura bhfuil siad i láthair, beidh ort pacáiste breise a shuiteáil ón dáileadh.

Struchtúr comhaid iso14651_t1 d’fhéadfadh cuma uafásach briathartha a bheith air, le rialacha neamhshoiléir maidir le hainmneacha a thógáil, ach má fhéachann tú air, tá gach rud simplí go leor. Déantar cur síos ar an struchtúr sa chaighdeán ISO 14652, ar féidir cóip de a íoslódáil ón suíomh Gréasáin oscailte-std.org. Is féidir cur síos eile ar an bhformáid comhaid a léamh i sonraíochtaí POSIX ó Grúpa Oscailte. Mar mhalairt ar an gcaighdeán a léamh, is féidir leat staidéar a dhéanamh ar chód foinse na feidhme chóimheas_léamh в glibc/locale/programs/ld-collate.c.

Breathnaíonn an struchtúr comhaid mar seo:

De réir réamhshocraithe, úsáidtear an carachtar mar charachtar éalaithe, agus is trácht é deireadh na líne tar éis an charachtair #. Is féidir an dá shiombail a ath-shainmhíniú, agus is é sin a dhéantar sa leagan nua den tábla:

escape_char /
comment_char %

Beidh comharthaí san fhormáid sa chomhad (cá háit x - digit heicsidheachúlach). Is é seo an léiriú heicsidheachúil de phointí cód Unicode san ionchódú UCS-4 (UTF-32). Gach eilimint eile idir lúibíní uillinn (lena n-áirítear , <2> agus a leithéidí) a mheas mar tairisigh téadracha shimplí nach bhfuil mórán brí acu lasmuigh den chomhthéacs.

Líne LC_COLLATE insíonn sé dúinn gurb é seo chugainn tús leis na sonraí a chuireann síos ar chomparáid teaghráin.

Ar dtús, sonraítear ainmneacha do na meáchain sa tábla comparáide agus ainmneacha na dteaglaim siombailí. Go ginearálta, baineann an dá chineál ainmneacha le dhá aonán éagsúla, ach sa chomhad iarbhír tá siad measctha. Sonraítear ainmneacha na meáchain leis an eochairfhocal collating-siombail (carachtar comparáide) mar nuair a dhéantar comparáid, measfar carachtair Unicode a bhfuil na meáchain chéanna acu mar charachtair coibhéiseacha.

Tá fad iomlán na coda san athbhreithniú comhaid reatha thart ar 900 líne. Tharraing mé samplaí ó áiteanna éagsúla chun treallacht ainmneacha agus cineálacha éagsúla comhréire a léiriú.

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>"

  • collating-siombail logs teaghrán OSMANA i dtábla ainmneacha na scálaí
  • collating-siombail .. cláraítear seicheamh ainmneacha ina bhfuil réimír S agus iarmhír uimhriúil heicsidheachúil ó 1D000 до 1D 35F.
  • Ffff в collating-siombail is cosúil le slánuimhir mhór gan síniú i heicsidheachúlach, ach níl ann ach ainm a d'fhéadfadh cuma mhaith
  • ainm ciallaíonn sé pointe cód san ionchódú UCS-4
  • collating-eilimint ó " " cláraíonn sé ainm nua do phéire poncanna Unicode.

Nuair a shainmhínítear ainmneacha na meáchain, sonraítear na meáchain iarbhír. Ós rud é nach bhfuil ach caidreamh níos mó ná níos lú ábhar i gcomparáid, déantar na meáchain a chinneadh le seicheamh simplí liostú ainmneacha. Liostaítear na meáchain “níos éadroime” ar dtús, ansin na meáchain “níos troime”. Cuir i gcuimhne duit go sanntar ceithre mheáchan difriúla do gach carachtar Unicode. Anseo cuirtear le chéile iad i seicheamh ordaithe amháin. Go teoiriciúil, d'fhéadfaí aon ainm siombalach a úsáid ag aon cheann de na ceithre leibhéal, ach léiríonn tuairimí go scarann ​​na forbróirí ainmneacha go meabhrach i leibhéil.

% 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

Ar deireadh, an tábla meáchain iarbhír.

Tá an chuid meáchain faoi iamh i línte eochairfhocail ordú_tús и ordú_deireadh. Roghanna breise ordú_tús a chinneadh cén treo a scanadh sraitheanna ag gach leibhéal comparáide. Is é an socrú réamhshocraithe aghaidh. Is éard atá i gcorp an ailt línte ina bhfuil an cód siombaile agus a cheithre mheáchan. Is féidir leis an gcarachtar féin, pointe cód, nó ainm siombalach a shainmhínítear roimhe seo an cód carachtair a léiriú. Is féidir meáchain a thabhairt freisin d’ainmneacha siombalacha, pointí cód, nó na siombailí iad féin. Má úsáidtear códphointí nó carachtair, is ionann a meáchan agus luach uimhriúil an phointe cóid (suíomh sa tábla Unicode). Meastar carachtair nach bhfuil sonraithe go sainráite (de réir mar a thuigim) a shanntar don tábla le meáchan príomhúil a mheaitseálann an suíomh sa tábla Unicode. Luach meáchain speisialta AR AGHAIDH ciallaíonn sé go ndéantar neamhaird den tsiombail ag an leibhéal cuí comparáide.

Chun struchtúr na scálaí a léiriú, roghnaigh mé trí bhlúire sách soiléir:

  • carachtair a ndéantar neamhaird iomlán orthu
  • siombailí comhionann leis an uimhir trí sa chéad dá leibhéal
  • tús na haibítre Coireallach, nach bhfuil diacriticí ann, agus dá bhrí sin déantar é a shórtáil go príomha de réir an chéad agus an tríú leibhéal.

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

Anois is féidir leat filleadh ar shórtáil na samplaí ó thús an ailt. Tá an luíochán sa chuid seo den tábla meáchain:

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

Is féidir a fheiceáil go bhfuil na marcanna poncaíochta ón tábla sa tábla seo ASCII (spás san áireamh) beagnach i gcónaí a neamhaird agus teaghráin a chur i gcomparáid. Is iad na heisceachtaí amháin ná línte a mheaitseálann i ngach rud seachas marcanna poncaíochta a fhaightear i suíomhanna meaitseála. Breathnaíonn na línte ó mo shampla (tar éis sórtáil) don algartam comparáide mar seo:

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

Ós rud é go dtagann príomhlitreacha sa Rúisis i dtábla na scálaí tar éis litreacha beaga (ag an tríú leibhéal níos troime ná ), Breathnaíonn an sórtáil go hiomlán ceart.

Agus athróg á shocrú LC_COLLATE=C lódáiltear tábla speisialta a shonraíonn comparáid beart-ar-beart

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'
};

Ós rud é in Unicode tagann an códphointe Ё roimh A, déantar na teaghráin a shórtáil dá réir.

Téacs agus táblaí dénártha

Ar ndóigh, is oibríocht an-choitianta é comparáid teaghrán, agus parsáil tábla CTT nós imeachta costasach go leor. Chun rochtain ar an tábla a bharrfheabhsú, cuirtear le chéile é i bhfoirm dhénártha leis an ordú localdef.

Foireann localdef glacann sé mar pharaiméadair comhad le tábla de shaintréithe náisiúnta (rogha -i), ina léirítear gach carachtar ag poncanna Unicode, agus comhad comhfhreagrais idir poncanna Unicode agus carachtair a bhfuil ionchódú ar leith acu (rogha -f). Mar thoradh ar an obair, cruthaítear comhaid dhénártha don locale leis an ainm atá sonraithe sa pharaiméadar deiridh.

glibc Tacaíonn dhá formáid comhaid dhénártha: "traidisiúnta" agus "nua-aimseartha".

Ciallaíonn an fhormáid thraidisiúnta gurb é ainm an locale ainm na fochomhadlainne i /usr/lib/locale/. Stórálann an fochomhadlann seo comhaid dhénártha LC_COLLATE, LC_CTYPE, LC_TIME agus mar sin de. Comhad LC_IDENTIFICATION ina bhfuil ainm foirmiúil an locale (a d’fhéadfadh a bheith difriúil ón ainm eolaire) agus tuairimí.

Is éard atá i gceist leis an bhformáid nua-aimseartha ná gach áit a stóráil in aon chartlann amháin /usr/lib/locale/locale-archive, atá mapáilte go dtí an chuimhne fíorúil ar gach próiseas ag baint úsáide as glibc. Tá an t-ainm locale san fhormáid nua-aimseartha faoi réir roinnt canónú - ní fhanann ach uimhreacha agus litreacha laghdaithe go cás íochtair sna hainmneacha ionchódaithe. Mar sin ru_RU.KOI8-R, a shábháil mar ru_RU.koi8r.

Cuardaítear comhaid ionchuir san eolaire reatha, agus sna heolairí freisin /usr/share/i18n/áiteanna/ и /usr/share/i18n/charmaps/ le haghaidh comhaid CTT agus comhaid a ionchódú, faoi seach.

Mar shampla, an t-ordú

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

thiomsóidh an comhad /usr/share/i18n/locales/ru_RU ag baint úsáide as comhad ionchódaithe /usr/share/i18n/charmaps/MAC-CYRILLIC.gz agus an toradh a shábháil i /usr/lib/locale/locale-archive faoin ainm ru_RU.maccyrillic

Má shocraíonn tú an athróg LANG = en_US.UTF-8 go glibc lorgóidh sé dénártaí locale sa seicheamh comhad agus eolaire seo a leanas:

/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/

Má tharlaíonn locale i bhformáidí traidisiúnta agus nua-aimseartha araon, tugtar tosaíocht don cheann nua-aimseartha.

Is féidir leat liosta na logaí tiomsaithe a fheiceáil leis an ordú locale -a.

Ag ullmhú do tábla comparáide

Anois, armtha leis an eolas, is féidir leat do tábla comparáide teaghrán idéalach féin a chruthú. Ba cheart don tábla seo comparáid cheart a dhéanamh idir litreacha na Rúise, lena n-áirítear an litir Ё, agus ag an am céanna marcanna poncaíochta a chur san áireamh i gcomhréir leis an tábla ASCII.

Tá dhá chéim sa phróiseas chun do tábla sórtála féin a ullmhú: an tábla meáchain a chur in eagar agus é a thiomsú i bhfoirm dhénártha leis an ordú localdef.

Chun an tábla comparáide a choigeartú le costais eagarthóireachta íosta, san fhormáid ISO 14652 Soláthraítear míreanna chun meáchain tábla atá ann cheana a choigeartú. Tosaíonn an chuid le eochairfhocal athordú-tar éis agus ag léiriú an tsuímh ina ndéantar an t-athsholáthar. Críochnaíonn an chuid leis an líne athordú-deireadh. Más gá roinnt codanna den tábla a cheartú, cruthaítear roinn do gach cuid den sórt sin.

Chóipeáil mé leaganacha nua de na comhaid iso14651_t1_coitianta и ru_RU ón stór glibc chuig mo eolaire baile ~/.local/share/i18n/locales/ agus chuir mé beagán eagarthóireachta ar an alt LC_COLLATE в ru_RU. Tá leaganacha nua de chomhaid go hiomlán comhoiriúnach le mo leagan glibc. Más mian leat leaganacha níos sine de chomhaid a úsáid, beidh ort na hainmneacha siombalacha agus an áit a dtosaíonn an t-athsholáthar a athrú sa tábla.

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

Go deimhin, bheadh ​​​​sé riachtanach na réimsí a athrú i LC_IDENTIFICATION ionas go díríonn siad ar an locale ru_MY, ach i mo shampla ní raibh sé seo ag teastáil, mar d'eisiaigh mé an chartlann ón gcuardach le haghaidh locales locale-cartlann.

Sin localdef d'oibrigh le comhaid i mo fhillteán trí athróg I18NPATH Is féidir leat eolaire breise a chur leis chun comhaid ionchuir a chuardach, agus is féidir an t-eolaire chun comhaid dhénártha a shábháil a shonrú mar chonair le slais:

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

POSIX le fios go bhfuil i TEANGA is féidir leat cosáin iomlána a scríobh chuig eolairí le comhaid locale, ag tosú le slais ar aghaidh, ach glibc в Linux déantar gach cosán a chomhaireamh ón mbunchomhadlann, ar féidir a shárú trí athróg LOCPATH. Tar éis a shuiteáil LOCPATH=~/.local/lib/locale/ déanfar gach comhad a bhaineann le logánú a chuardach i m'fhillteán amháin. Cartlann na logaí leis an tacar athróg LOCPATH neamhaird.

Seo an tástáil chinntitheach:

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

Hooray! Rinneamar é!

Roinnt earráidí

D'fhreagair mé na ceisteanna a cuireadh ag an tús faoi shórtáil teaghrán cheana féin, ach tá cúpla ceist fós ann faoi earráidí - sofheicthe agus dofheicthe.

Fillfimid ar an bhfadhb bunaidh.

Agus an clár saghas agus clár páirt a ghlacadh bain úsáid as na feidhmeanna comparáide teaghrán céanna ó glibc. Conas a tharla sé sin páirt a ghlacadh thug earráid sórtála ar rónna curtha in eagar ag an ordú saghas sa cheantar ga_US.UTF-8? Tá an freagra simplí: saghas i gcomparáid leis an teaghrán iomlán, agus páirt a ghlacadh i gcomparáid leis an eochair amháin, a bhfuil de réir réamhshocraithe tús na teaghrán suas go dtí an carachtar spás bán. I mo shampla, bhí teachtaireacht earráide mar thoradh air seo mar níor tháinig sórtáil na gcéad fhocal sna línte le sórtáil na línte iomlána.

Logánta "C" ráthaíonn sé go ndéanfar na fo-theaghráin tosaigh suas go dtí an chéad spás a shórtáil i teaghráin shórtáilte freisin, ach ní cheiltíonn sé seo ach an earráid. Is féidir sonraí a roghnú (daoine leis na sloinnte céanna, ach céadainmneacha éagsúla) a thabharfadh toradh mícheart cumasc comhad gan an teachtaireacht earráide. Más mian linn páirt a ghlacadh línte comhaid chumasc de réir ainm iomlán, ansin bheadh ​​​​an bealach ceart a shonrú go sainráite ar an deighilteoir réimse agus a shórtáil de réir an réimse eochair, agus ní de réir na líne iomlán. Sa chás seo, rachaidh an cumasc ar aghaidh i gceart agus ní bheidh aon earráidí in aon locale:

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

D'éirigh leis an sampla a fhorghníomhú san ionchódú CP1251 earráid eile. Is é fírinne an scéil go bhfuil i ngach dáiltí is eol dom Linux tá an locale tiomsaithe in easnamh ar phacáistí ru_RU.CP1251. Mura bhfaightear an locale tiomsaithe, ansin saghas úsáideann sé go ciúin comparáid beart-ar-beart, agus sin an méid a chonaiceamar.

Dála an scéil, tá glitch beag eile a bhaineann le inaccessibility na locales tiomsaithe. Foireann LOCPATH=/tmp locale -a tabharfaidh sé liosta de na logaí go léir i locale-cartlann, ach leis an tacar athróg LOCPATH do gach clár (lena n-áirítear an chuid is mó locale) ní bheidh na logaí seo ar fáil.

$> 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

Conclúid

Más ríomhchláraitheoir tú a bhfuil taithí agat ar smaoineamh gur sraith beart iad teaghráin, ansin is é do rogha féin LC_COLLATE=C.

Más teangeolaí nó tiomsaitheoir foclóra tú, is fearr duit a thiomsú i do locale.

Má tá tú i d'úsáideoir simplí, ansin is gá duit a fháil i dtaithí ar an bhfíric go bhfuil an t-ordú ls -a comhaid aschuir ag tosú le ponc measctha le comhaid ag tosú le litir, agus Ceannasaí meán oíche, a úsáideann a fheidhmeanna inmheánacha chun ainmneacha a shórtáil, cuireann sé comhaid ag tosú le ponc ag tús an liosta.

tagairtí

Tuarascáil Uimh. 10 algartam tiomsaithe Unicode

Meáchan carachtair ag unicode.org

ICU — leabharlann a chur i bhfeidhm chun oibriú le Unicode ó IBM.

Tástáil sórtála ag baint úsáide as ICU

meáchain carachtar i ISO 14651

Cur síos ar an bhformáid comhaid le scálaí ISO 14652

Plé ar chomparáid teaghrán i glibc

Foinse: will.com

Add a comment