Bawo ni Linux ká too awọn gbolohun ọrọ

Ifihan

Gbogbo rẹ bẹrẹ pẹlu iwe afọwọkọ kukuru ti o yẹ ki o darapọ alaye adirẹsi imeeli awọn oṣiṣẹ ti o gba lati atokọ ti awọn olumulo atokọ ifiweranṣẹ, pẹlu awọn ipo oṣiṣẹ ti o gba lati aaye data Eka HR. Awọn atokọ mejeeji jẹ okeere si awọn faili ọrọ Unicode UTF-8 ati fipamọ pẹlu awọn ipari laini Unix.

Akoonu mail.txt

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

Akoonu buhg.txt

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

Lati dapọ, awọn faili ti wa ni lẹsẹsẹ nipasẹ aṣẹ Unix too ati fi silẹ si titẹ sii ti eto Unix da, eyiti o kuna lairotẹlẹ pẹlu aṣiṣe kan:

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

Wiwo abajade yiyan pẹlu oju rẹ fihan pe, ni gbogbogbo, tito lẹsẹsẹ jẹ deede, ṣugbọn ninu ọran ti awọn isẹlẹ ti awọn orukọ idile ọkunrin ati obinrin, awọn obinrin wa ṣaaju awọn ọkunrin:

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

O dabi glitch yiyan ni Unicode tabi bii ifihan ti abo ni algorithm yiyan. Ni igba akọkọ ti jẹ, dajudaju, diẹ o ṣeeṣe.

Jẹ ki a fi silẹ fun bayi da ati idojukọ lori too. Jẹ ká gbiyanju lati yanju awọn isoro nipa lilo ijinle sayensi poking. Ni akọkọ, jẹ ki a yi agbegbe pada lati ni U.S on ru_RU. Lati to lẹsẹsẹ, yoo to lati ṣeto oniyipada ayika LC_COLLATE, ṣugbọn a ko ni padanu akoko lori awọn nkan ti o kere julọ:

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

Ko si ohun ti o yipada.

Jẹ ki a gbiyanju lati tun awọn faili pada sinu koodu baiti kan:

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

Lẹẹkansi ko si ohun ti o yipada.

Ko si ohun ti o le ṣe, iwọ yoo ni lati wa ojutu kan lori Intanẹẹti. Ko si nkankan taara nipa awọn orukọ idile Russian, ṣugbọn awọn ibeere wa nipa awọn aiṣedeede yiyan miiran. Fun apẹẹrẹ, eyi ni iṣoro kan: unix too ṣe itọju awọn ohun kikọ '-' (dash) bi airi. Ni kukuru, awọn gbolohun ọrọ "a-b", "aa", "ac" jẹ lẹsẹsẹ bi "aa", "a-b", "ac".

Idahun si jẹ boṣewa nibi gbogbo: lo agbegbe ti pirogirama "C" inú yín yóò sì dùn. Jẹ ki a gbiyanju:

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

Nkankan ti yipada. Awọn Ivanovs ni ila ni ọna ti o tọ, biotilejepe Yolkina ti yọ ni ibikan. Jẹ ki a pada si iṣoro atilẹba:

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

O ṣiṣẹ laisi awọn aṣiṣe, bi Intanẹẹti ti ṣe ileri. Ati eyi pelu Yolkina ni laini akọkọ.

Iṣoro naa dabi pe o yanju, ṣugbọn ni ọran, jẹ ki a gbiyanju fifi koodu Rọsia miiran - Windows CP1251:

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

Abajade titọpa, ti o jẹ aibikita, yoo ṣe deede pẹlu agbegbe naa "C", ati gbogbo apẹẹrẹ, gẹgẹbi, nṣiṣẹ laisi awọn aṣiṣe. Diẹ ninu awọn Iru mysticism.

Emi ko fẹ mysticism ni siseto nitori ti o maa boju mu awọn aṣiṣe. A yoo ni lati wo ni pataki bi o ṣe n ṣiṣẹ. too ati kini o ni ipa lori? LC_COLLATE .

Ni ipari Emi yoo gbiyanju lati dahun awọn ibeere:

  • Kilode ti awọn orukọ-idile obinrin ṣe lẹsẹsẹ ni aṣiṣe?
  • idi ti LANG = ru_RU.CP1251 ni tan-jade lati wa ni deede LANG=C
  • idi ṣe too и da o yatọ si ero nipa awọn ibere ti lẹsẹsẹ awọn gbolohun ọrọ
  • kilode ti awọn aṣiṣe wa ni gbogbo awọn apẹẹrẹ mi?
  • nipari bi o ṣe le to awọn gbolohun ọrọ si ifẹran rẹ

Tito lẹsẹsẹ ni Unicode

Iduro akọkọ yoo jẹ ijabọ imọ-ẹrọ No.. 10 ẹtọ Unicode akojọpọ alugoridimu online unicode.org. Ijabọ naa ni ọpọlọpọ awọn alaye imọ-ẹrọ, nitorinaa jẹ ki n fun ni ṣoki kukuru ti awọn imọran akọkọ.

collation - “fifiwe” awọn okun jẹ ipilẹ ti eyikeyi algoridimu yiyan. Awọn algoridimu funrara wọn le yatọ ("bubble", "darapọ", "yara"), ṣugbọn gbogbo wọn yoo lo lafiwe ti bata meji lati pinnu ilana ti wọn han.

Tito awọn gbolohun ọrọ ni ede adayeba jẹ iṣoro ti o ni idiju kan. Paapaa ninu awọn fifi ẹnọ kọ nkan-baiti ti o rọrun julọ, aṣẹ ti awọn lẹta ni alfabeti, paapaa ni diẹ ninu awọn ọna ti o yatọ si ti alfabeti Latin Gẹẹsi, kii yoo ṣe deede pẹlu aṣẹ ti awọn iye nọmba pẹlu eyiti awọn lẹta wọnyi ti ni koodu. Nitorinaa ninu alfabeti German lẹta naa Ö duro laarin О и P, ati ninu fifi koodu CP850 o gba laarin ÿ и Ü.

O le gbiyanju lati ṣabọ lati fifi koodu kan pato ki o gbero awọn lẹta “bojumu” ti o ṣeto ni diẹ ninu awọn aṣẹ, bi o ti ṣe ni Unicode. Awọn kooduopo UTF8, UTF16 tabi ọkan-baiti KOI8-R (ti o ba nilo ipin ti o lopin ti Unicode) yoo fun oriṣiriṣi awọn aṣoju nọmba ti awọn lẹta, ṣugbọn tọka si awọn eroja kanna ti tabili ipilẹ.

O wa ni pe paapaa ti a ba kọ tabili aami kan lati ibere, a kii yoo ni anfani lati fi aṣẹ aami agbaye si i. Ni oriṣiriṣi awọn alfabeti orilẹ-ede ti o lo awọn lẹta kanna, aṣẹ ti awọn lẹta wọnyi le yatọ. Fun apẹẹrẹ, ni Faranse Æ ao kà si ligature ati lẹsẹsẹ bi okun AE. Ni Norwegian Æ yoo jẹ lẹta ti o yatọ, eyiti o wa lẹhin Z. Nipa ọna, ni afikun si awọn ligatures bi Æ Awọn lẹta ti a kọ pẹlu awọn aami pupọ wa. Nitorinaa ninu alfabeti Czech lẹta kan wa Ch, eyi ti o duro laarin H и I.

Ni afikun si awọn iyatọ ninu awọn alfabeti, awọn aṣa orilẹ-ede miiran wa ti o ni ipa tito lẹsẹsẹ. Ni pato, ibeere naa waye: ni aṣẹ wo ni awọn ọrọ ti o ni awọn lẹta nla ati kekere yoo han ninu iwe-itumọ? Tito lẹsẹsẹ le tun ni ipa nipasẹ lilo awọn aami ifamisi. Ni ede Sipeeni, ami ibeere ti o yipada ni a lo ni ibẹrẹ gbolohun ọrọ kan (Ṣe o fẹran orin bi?). Ni ọran yii, o han gbangba pe awọn gbolohun ọrọ ifọrọwanilẹnuwo ko yẹ ki o ṣe akojọpọ sinu iṣupọ lọtọ ni ita alfabeti, ṣugbọn bawo ni a ṣe le to awọn ila pẹlu awọn ami ifamisi miiran?

Emi kii yoo duro lori yiyan awọn okun ni awọn ede ti o yatọ pupọ si awọn ti Yuroopu. Ṣe akiyesi pe ni awọn ede pẹlu apa ọtun-si-osi tabi oke-si-isalẹ itọsọna kikọ, awọn ohun kikọ ninu awọn ila ni o ṣee ṣe julọ ti o fipamọ ni ilana kika, ati paapaa awọn eto kikọ ti kii-alfabeti ni awọn ọna tiwọn ti paṣẹ ohun kikọ awọn laini nipasẹ kikọ. . Fun apẹẹrẹ, awọn hieroglyphs le ṣe paṣẹ nipasẹ ara (ara.Awọn bọtini ohun kikọ Kannada) tàbí nípa sísọ̀rọ̀. Lati so ooto, Emi ko ni imọran bi o ṣe yẹ ki a ṣeto awọn emojis, ṣugbọn o le wa pẹlu nkan fun wọn paapaa.

Da lori awọn ẹya ti a ṣe akojọ loke, awọn ibeere ipilẹ fun ifiwera awọn gbolohun ọrọ ti o da lori awọn tabili Unicode ni a ṣe agbekalẹ:

  • lafiwe ti awọn gbolohun ọrọ ko da lori awọn ipo ti ohun kikọ ninu awọn koodu tabili;
  • awọn ilana ti awọn ohun kikọ ti o ṣẹda ẹda kan ni a dinku si fọọmu canonical (A + Circle oke jẹ kanna bi Å);
  • Nigbati o ba ṣe afiwe awọn gbolohun ọrọ, ohun kikọ kan ni a gbero ni ipo ti okun naa ati, ti o ba jẹ dandan, ni idapo pẹlu awọn aladugbo rẹ sinu ẹyọkan lafiwe (Ch ni Czech) tabi ti pin si ọpọlọpọ (Æ ni Faranse);
  • gbogbo awọn ẹya orilẹ-ede (alphabet, uppercase/kekere, aami ifamisi, aṣẹ awọn iru kikọ) gbọdọ wa ni tunto titi di iṣẹ iyansilẹ ti aṣẹ (emoji);
  • lafiwe ṣe pataki kii ṣe fun yiyan nikan, ṣugbọn tun ni ọpọlọpọ awọn aaye miiran, fun apẹẹrẹ fun sisọ awọn sakani ila (fidipo {A... z} ni Basi);
  • lafiwe yẹ ki o ṣee ṣe ni kiakia.

Ni afikun, awọn onkọwe ijabọ naa ṣe agbekalẹ awọn ohun-ini lafiwe ti awọn olupilẹṣẹ algorithm ko yẹ ki o gbẹkẹle:

  • algorithm lafiwe ko yẹ ki o nilo eto awọn ohun kikọ lọtọ fun ede kọọkan (awọn ede Russia ati Yukirenia pin ọpọlọpọ awọn ohun kikọ Cyrillic);
  • lafiwe ko yẹ ki o dale lori aṣẹ awọn ohun kikọ ninu awọn tabili Unicode;
  • Iwọn okun ko yẹ ki o jẹ ẹya ti okun, niwon okun kanna ni awọn ipo aṣa ti o yatọ le ni awọn iwọn oriṣiriṣi;
  • awọn iwọn ila le yipada nigbati o ba dapọ tabi yapa (lati x < y ko tẹle iyẹn xz < yz);
  • o yatọ si awọn gbolohun ọrọ nini kanna òṣuwọn ti wa ni kà dogba lati awọn ojuami ti wo ti ayokuro alugoridimu. Agbekale afikun ibere ti iru awọn gbolohun ọrọ jẹ ṣee ṣe, ṣugbọn o le degrade iṣẹ;
  • Lakoko tito lẹsẹsẹ leralera, awọn ori ila pẹlu awọn iwuwo kanna le jẹ paarọ. Agbara jẹ ohun-ini ti algorithm yiyan kan pato, kii ṣe ohun-ini ti algorithm lafiwe okun (wo paragira ti tẹlẹ);
  • Awọn ofin tito lẹsẹsẹ le yipada ni akoko pupọ bi awọn aṣa aṣa ṣe atunṣe/ayipada.

O tun ṣe ilana pe algorithm lafiwe ko mọ nkankan nipa awọn atunmọ ti awọn gbolohun ọrọ ti n ṣiṣẹ. Nitorinaa, awọn gbolohun ọrọ ti o ni awọn nọmba nikan ko yẹ ki o ṣe afiwe bi awọn nọmba, ati ninu awọn atokọ ti awọn orukọ Gẹẹsi nkan naa (Beatles, Awọn).

Lati le ni itẹlọrun gbogbo awọn ibeere wọnyi, a dabaa algorithm ti tabili tabili ti ọpọlọpọ-ipele (gangan ipele mẹrin).

Ni iṣaaju, awọn ohun kikọ ti o wa ninu okun ti dinku si fọọmu canonical ati ki o ṣe akojọpọ si awọn ẹya ti lafiwe. Ẹyọ kọọkan ti lafiwe ni a yan ọpọlọpọ awọn iwuwo ti o baamu si awọn ipele pupọ ti lafiwe. Awọn iwọn ti awọn iwọn lafiwe jẹ awọn eroja ti awọn eto ti a paṣẹ (ninu ọran yii, awọn odidi) ti o le ṣe afiwe fun diẹ sii tabi kere si. Pataki itumo AFOJUMO (0x0) tumọ si pe ni ipele afiwe ti o baamu ẹyọ yii ko ni ipa ninu lafiwe. Ifiwera ti awọn okun le tun ṣe ni igba pupọ, lilo awọn iwuwo ti awọn ipele ti o baamu. Ni ipele kọọkan, awọn iwuwo ti awọn iwọn lafiwe ti awọn ori ila meji ni a ṣe afiwera lẹsẹsẹ pẹlu ara wọn.

Ni awọn imuṣẹ oriṣiriṣi ti algorithm fun awọn aṣa atọwọdọwọ orilẹ-ede ti o yatọ, awọn iye ti awọn iṣiro le yatọ, ṣugbọn boṣewa Unicode pẹlu tabili ipilẹ ti awọn iwuwo - "Tabili Ikojọpọ Unicode Aiyipada" (DUCET). Emi yoo fẹ lati ṣe akiyesi pe iṣeto oniyipada naa LC_COLLATE jẹ kosi itọkasi yiyan ti tabili iwuwo ni iṣẹ lafiwe okun.

Awọn iye iwọn DUCET ṣeto bi wọnyi:

  • ni ipele akọkọ, gbogbo awọn lẹta ti dinku si ọran kanna, a sọ dicritics nù, awọn ami ifamisi (kii ṣe gbogbo) ni aibikita;
  • ni ipele keji, awọn dicritics nikan ni a ṣe akiyesi;
  • ni ipele kẹta, ọran nikan ni a gba sinu akọọlẹ;
  • ni ipele kẹrin, awọn aami ifamisi nikan ni a gba sinu akọọlẹ.

Ifiwewe naa waye ni ọpọlọpọ awọn igbasẹ: akọkọ, awọn iyeida ti ipele akọkọ ni a ṣe afiwe; ti awọn iwọn ba ṣe deede, lẹhinna afiwera leralera pẹlu awọn iwọn ipele keji ni a ṣe; lẹhinna boya kẹta ati ẹkẹrin.

Ifiwera dopin nigbati awọn ori ila ba ni awọn ẹya ti o baamu pẹlu awọn iwọn iwuwo. Awọn ori ila ti o ni awọn iwọn dogba ni gbogbo awọn ipele mẹrin ni a gba pe o dọgba si ara wọn.

Yi alugoridimu (pẹlu opo kan ti afikun imọ awọn alaye) fun awọn orukọ lati jabo No.. 10 - "Alugoridimu akojọpọ Unicode" (ACU).

Eyi ni ibi ti ihuwasi yiyan lati apẹẹrẹ wa di alaye diẹ sii. Yoo dara lati ṣe afiwe rẹ pẹlu boṣewa Unicode.

Lati ṣe idanwo awọn imuse ACU pataki kan wa idanwo naa, lilo òṣuwọn faili, imuse DUCET. O le wa gbogbo iru awọn ohun apanilẹrin ninu faili irẹjẹ. Fun apẹẹrẹ, aṣẹ ti mahjong ati awọn Dominoes Yuroopu wa, bakanna bi aṣẹ ti awọn ipele ni deki ti awọn kaadi (aami 1F000 ati siwaju sii). Awọn ipele kaadi ni a gbe ni ibamu si awọn ofin ti Afara - PCBT, ati awọn kaadi ti o wa ninu aṣọ wa ni ọna T, 2,3, XNUMX ... K.

Ṣiṣayẹwo pẹlu ọwọ pe awọn ori ila ti wa ni lẹsẹsẹ daradara ni ibamu si DUCET yoo jẹ arẹwẹsi pupọ, ṣugbọn, ni oriire fun wa, imuse apẹẹrẹ ti ile-ikawe wa fun ṣiṣẹ pẹlu Unicode - "Awọn ohun elo agbaye fun Unicode"(ICU).

Lori oju opo wẹẹbu ti ile-ikawe yii, ti dagbasoke ni Emu, awọn oju-iwe demo wa, pẹlu okun lafiwe alugoridimu. A tẹ awọn laini idanwo wa pẹlu awọn eto aiyipada ati, wo ati kiyesi i, a gba yiyan pipe ti Ilu Rọsia.

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

Nipa ọna, oju opo wẹẹbu ICU O le wa alaye kan ti algorithm lafiwe nigbati o nṣiṣẹ awọn ami ifamisi. Ni awọn apẹẹrẹ Ijọpọ FAQ apostrophe ati hyphen ti wa ni bikita.

Unicode ṣe iranlọwọ fun wa, ṣugbọn wa awọn idi fun ihuwasi ajeji too в Linux yoo ni lati lọ si ibomiiran.

Tito lẹsẹsẹ ni glibc

Wiwo iyara ti awọn koodu orisun ohun elo too ati bẹbẹ lọ GNU mojuto Utils fihan pe ninu ohun elo funrararẹ, isọdi wa si isalẹ lati tẹ iye ti isiyi ti oniyipada naa LC_COLLATE nigbati o nṣiṣẹ ni ipo yokokoro:

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

Awọn afiwe okun ni a ṣe ni lilo iṣẹ boṣewa strcoll, eyi ti o tumo ohun gbogbo awon jẹ ninu awọn ìkàwé glibc.

Ni wiki ise agbese glibc igbẹhin si okun lafiwe ọkan ìpínrọ. Lati paragira yii o le ni oye pe ni glibc tito lẹsẹsẹ da lori algorithm ti a ti mọ tẹlẹ fun wa ACU (Algoridimu akojọpọ Unicode) ati/tabi ni boṣewa ti o sunmọ rẹ ISO 14651 (International okun ibere ati lafiwe). Nipa boṣewa tuntun, o yẹ ki o ṣe akiyesi pe lori aaye naa standards.iso.org ISO 14651 ti kede ni gbangba ti o wa, ṣugbọn ọna asopọ ti o baamu nyorisi oju-iwe ti ko si. Google da awọn oju-iwe pupọ pada pẹlu awọn ọna asopọ si awọn aaye osise ti o funni lati ra ẹda itanna ti boṣewa fun ọgọrun awọn owo ilẹ yuroopu, ṣugbọn ni oju-iwe kẹta tabi kẹrin ti awọn abajade wiwa tun wa awọn ọna asopọ taara si PDF. Ni gbogbogbo, boṣewa jẹ iṣe ko yatọ si ACU, ṣugbọn o jẹ alaidun diẹ sii lati ka nitori ko ni awọn apẹẹrẹ ti o han gbangba ti awọn ẹya orilẹ-ede ti tito lẹsẹsẹ okun.

Awọn julọ awon alaye lori wiki ọna asopọ kan wa lati kokoro tracker pẹlu kan fanfa ti imuse ti okun lafiwe ni glibc. Lati inu ijiroro o le kọ ẹkọ pe glibc ti a lo lati fi ṣe afiwe awọn gbolohun ọrọ ISOtabili ti ara ẹni Awọn wọpọ Àdàkọ Table (CTT), adirẹsi eyiti o le rii ninu ohun elo naa A boṣewa ISO 14651. Laarin 2000 ati 2015 tabili yii ni glibc ko ni olutọju ati pe o yatọ pupọ (o kere ju ita) lati ẹya lọwọlọwọ ti boṣewa. Lati ọdun 2015 si ọdun 2018, aṣamubadọgba si ẹya tuntun ti tabili waye, ati ni bayi o ni aye lati pade ni igbesi aye tuntun ẹya tuntun ti tabili (CentOS 8), ati atijọ (CentOS 7).

Ni bayi pe a ni gbogbo alaye nipa algoridimu ati awọn tabili iranlọwọ, a le pada si iṣoro atilẹba ati loye bi a ṣe le ṣajọ awọn okun ni deede ni agbegbe Russian.

ISO 14651 / 14652

Awọn koodu orisun ti tabili ti a nifẹ si CTT lori ọpọlọpọ awọn pinpin Linux jẹ ninu awọn katalogi /usr/pin/i18n/awọn agbegbe/. Tabili funrararẹ wa ninu faili naa iso14651_t1_wọpọ. Lẹhinna eyi ni itọsọna faili daakọ iso14651_t1_common to wa ninu faili iso14651_t1, eyiti, leteto, wa ninu awọn faili orilẹ-ede, pẹlu ni U.S и ru_RU. Lori ọpọlọpọ awọn pinpin Linux Gbogbo awọn faili orisun wa ninu fifi sori ipilẹ, ṣugbọn ti wọn ko ba wa, iwọ yoo ni lati fi package afikun sii lati pinpin.

Ilana faili iso14651_t1 le dabi lasan verbose, pẹlu ti kii-kedere ofin fun a Kọ awọn orukọ, ṣugbọn ti o ba wo ni o, ohun gbogbo ni oyimbo o rọrun. Awọn be ti wa ni apejuwe ninu awọn bošewa ISO 14652, ẹda kan ti o le ṣe igbasilẹ lati oju opo wẹẹbu ìmọ-std.org. Apejuwe miiran ti ọna kika faili ni a le ka ninu ni pato POSIX lati OpenGroup. Gẹgẹbi yiyan si kika boṣewa, o le ṣe iwadi koodu orisun ti iṣẹ naa collate_read в glibc/locale/awọn eto/ld-collate.c.

Eto faili naa dabi eyi:

Nipa aiyipada, ohun kikọ naa ni a lo bi ihuwasi ona abayo, ati ipari laini lẹhin kikọ # jẹ asọye. Awọn aami mejeeji le jẹ tuntumọ, eyiti o jẹ ohun ti a ṣe ni ẹya tuntun ti tabili:

escape_char /
comment_char %

Faili naa yoo ni awọn ami-ami ninu ọna kika tabi (Nibo x - nọmba hexadecimal). Eyi ni aṣoju hexadecimal ti awọn aaye koodu Unicode ninu fifi koodu naa UCS-4 (UTF-32). Gbogbo awọn eroja miiran ni awọn biraketi igun (pẹlu , <2> ati bii) ni a gba awọn iduro okun ti o rọrun ti o ni itumo diẹ ni ita ti ọrọ-ọrọ.

Laini LC_COLLATE sọ fún wa pé tókàn bẹrẹ awọn data apejuwe awọn lafiwe ti awọn gbolohun ọrọ.

Ni akọkọ, awọn orukọ ni pato fun awọn iwuwo ni tabili lafiwe ati awọn orukọ fun awọn akojọpọ aami. Ni gbogbogbo, awọn oriṣi orukọ meji jẹ ti awọn nkan oriṣiriṣi meji, ṣugbọn ninu faili gangan wọn ti dapọ. Awọn orukọ ti awọn òṣuwọn ti wa ni pato nipasẹ awọn Koko ikojọpọ-aami (iwa afiwera) nitori nigbati o ba ṣe afiwe, awọn ohun kikọ Unicode ti o ni awọn iwuwo kanna ni ao gba si awọn ohun kikọ deede.

Lapapọ ipari ti apakan ninu atunyẹwo faili lọwọlọwọ jẹ awọn laini 900. Mo fa awọn apẹẹrẹ lati awọn aaye pupọ lati ṣe afihan aibikita ti awọn orukọ ati ọpọlọpọ awọn iru sintasi.

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

  • akojọpọ-aami àkọọlẹ a okun OSMANYA ninu tabili awọn orukọ ti irẹjẹ
  • kojọpọ-aami .. forukọsilẹ ọkọọkan awọn orukọ ti o ni ìpele S ati suffix nomba hexadecimal lati 1D000 si 1D35F.
  • FFFF в kojọpọ-aami wulẹ bi kan ti o tobi unsigned odidi ni hexadecimal, ṣugbọn o kan orukọ kan ti o le dabi
  • имя tumo si koodu ojuami ni fifi koodu UCS-4
  • ikojọpọ-ero lati "" forukọsilẹ orukọ titun fun bata ti Unicode aami.

Ni kete ti awọn orukọ ti awọn òṣuwọn ti wa ni telẹ, awọn gangan òṣuwọn pato. Niwọn bi awọn ibatan ti o tobi ju-kere nikan ṣe pataki ni ifiwera, awọn iwuwo jẹ ipinnu nipasẹ ọna ti o rọrun ti awọn orukọ atokọ. Awọn iwọn “fẹẹrẹfẹ” ti wa ni atokọ ni akọkọ, lẹhinna awọn “wuwo”. Jẹ ki n leti pe ohun kikọ Unicode kọọkan ni a yan awọn iwuwo oriṣiriṣi mẹrin. Nibi ti won ti wa ni idapo sinu kan nikan paṣẹ ọkọọkan. Ni imọran, eyikeyi orukọ aami le ṣee lo ni eyikeyi ninu awọn ipele mẹrin, ṣugbọn awọn asọye fihan pe awọn olupilẹṣẹ ni opolo ya awọn orukọ si awọn ipele.

% 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

Níkẹyìn, gangan àdánù tabili.

Abala awọn iwuwo ti wa ni pipade ni awọn laini koko ibere_bẹrẹ и ibere_pari. Awọn aṣayan afikun ibere_bẹrẹ pinnu ninu eyiti awọn ori ila itọsọna ti ṣayẹwo ni ipele kọọkan ti lafiwe. Eto aiyipada jẹ siwaju. Ara ti apakan naa ni awọn laini ti o ni koodu aami ati awọn iwuwo mẹrin rẹ ninu. Koodu ohun kikọ le jẹ aṣoju nipasẹ ohun kikọ funrararẹ, aaye koodu kan, tabi orukọ aami ti asọye tẹlẹ. Awọn iwuwo le tun jẹ fifun awọn orukọ aami, awọn aaye koodu, tabi awọn aami funrara wọn. Ti o ba ti lo awọn aaye koodu tabi awọn ohun kikọ, iwuwo wọn jẹ kanna bi iye nomba ti aaye koodu (ipo ni tabili Unicode). Awọn ohun kikọ ti a ko sọ ni gbangba (bi MO ṣe loye) ni a gba pe a yàn si tabili pẹlu iwuwo akọkọ ti o baamu ipo ni tabili Unicode. Pataki àdánù iye IBI tumo si wipe aami ti wa ni bikita ni awọn yẹ ipele ti lafiwe.

Lati ṣe afihan ọna ti awọn irẹjẹ, Mo yan awọn ajẹkù ti o han gbangba mẹta:

  • ohun kikọ ti o ti wa ni patapata bikita
  • awọn aami deede si nọmba mẹta ni awọn ipele meji akọkọ
  • ibẹrẹ ti awọn Cyrillic alfabeti, eyi ti ko ni diacritics, ati nitorina ti wa ni lẹsẹsẹ nipasẹ akọkọ ati kẹta ipele.

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

Bayi o le pada si yiyan awọn apẹẹrẹ lati ibẹrẹ nkan naa. Ibuba wa ni apakan yii ti tabili iwuwo:

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

O le rii pe ninu tabili yii awọn aami ifamisi lati tabili ASCII (pẹlu aaye) fere nigbagbogbo bikita nigbati o ba ṣe afiwe awọn gbolohun ọrọ. Awọn imukuro nikan ni awọn ila ti o baamu ni ohun gbogbo ayafi awọn aami ifamisi ti a rii ni awọn ipo ibaamu. Awọn ila lati apẹẹrẹ mi (lẹhin yiyan) fun algorithm lafiwe dabi eyi:

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

Ṣiyesi pe ninu tabili awọn irẹjẹ, awọn lẹta nla ni Ilu Rọsia wa lẹhin awọn lẹta kekere (ni ipele kẹta wuwo ju ), tito lẹsẹsẹ dabi pe o tọ.

Nigbati o ba ṣeto oniyipada LC_COLLATE=C tabili pataki kan ti kojọpọ ti o ṣe afihan lafiwe baiti-nipasẹ-baiti

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

Niwọn bi ni Unicode ojuami koodu Ё wa niwaju A, awọn okun ti wa ni lẹsẹsẹ ni ibamu.

Ọrọ ati awọn tabili alakomeji

O han ni, lafiwe okun jẹ iṣẹ ṣiṣe ti o wọpọ pupọ, ati sisọ tabili CTT oyimbo leri ilana. Lati je ki wiwọle si tabili, o ti wa ni compiled sinu alakomeji fọọmu pẹlu awọn pipaṣẹ localdef.

Egbe localdef gba bi awọn paramita faili pẹlu tabili ti awọn abuda orilẹ-ede (aṣayan -i), ninu eyiti gbogbo awọn ohun kikọ ti wa ni ipoduduro nipasẹ awọn aami Unicode, ati faili ifọrọranṣẹ laarin awọn aami Unicode ati awọn ohun kikọ ti fifi koodu kan pato (aṣayan). -f). Bi abajade iṣẹ naa, awọn faili alakomeji ni a ṣẹda fun agbegbe pẹlu orukọ ti a sọ ni paramita to kẹhin.

glibc ṣe atilẹyin ọna kika faili alakomeji meji: "ibile" ati "igbalode".

Ọna kika ibile tumọ si pe orukọ agbegbe ni orukọ ti iwe-ipamọ inu /usr/lib/agbegbe/. Itọsọna abẹlẹ yii tọju awọn faili alakomeji LC_COLLATE, LC_CTYPE, LC_TIME ati bẹbẹ lọ. Faili LC_IDENTIFICATION ni orukọ deede ti agbegbe naa (eyiti o le yatọ si orukọ itọsọna) ati awọn asọye.

Ọna kika ode oni pẹlu titoju gbogbo awọn agbegbe ni ibi ipamọ kan /usr/lib/locale/locale-archive, eyi ti o ti ya aworan si awọn foju iranti ti gbogbo awọn ilana lilo glibc. Orukọ agbegbe ni ọna kika ode oni jẹ koko ọrọ si diẹ ninu awọn canonization - awọn nọmba nikan ati awọn lẹta ti o dinku si kekere ti o wa ninu awọn orukọ fifi koodu. Nitorina ru_RU.KOI8-R, yoo wa ni fipamọ bi ru_RU.koi8r.

Awọn faili ti nwọle ni a wa ninu iwe ilana lọwọlọwọ, bakannaa ninu awọn ilana /usr/pin/i18n/awọn agbegbe/ и /usr/pin/i18n/charmaps/ fun awọn faili CTT ati fifi koodu awọn faili, lẹsẹsẹ.

Fun apẹẹrẹ, aṣẹ naa

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

yoo ṣe akopọ faili naa /usr/pin/i18n/locales/ru_RU lilo faili fifi koodu /usr/pin/i18n/charmaps/MAC-CYRILLIC.gz ati fi abajade pamọ sinu /usr/lib/locale/locale-archive labẹ orukọ ru_RU.maccyrillic

Ti o ba ṣeto oniyipada LANG = en_US.UTF-8 lẹhinna glibc yoo wa awọn alakomeji agbegbe ni ọna atẹle ti awọn faili ati awọn ilana:

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

Ti agbegbe ba waye ni awọn ọna kika ibile ati ti ode oni, lẹhinna pataki ni a fun ni igbalode.

O le wo atokọ ti awọn agbegbe ti a ṣajọpọ pẹlu aṣẹ naa agbegbe -a.

Ngbaradi tabili lafiwe rẹ

Bayi, ni ihamọra pẹlu imọ, o le ṣẹda tabili lafiwe okun pipe tirẹ. Tabili yii yẹ ki o ṣe afiwe awọn lẹta Russian ni deede, pẹlu lẹta Ё, ati ni akoko kanna ṣe akiyesi awọn ami ifamisi ni ibamu pẹlu tabili. ASCII.

Ilana ti ngbaradi tabili yiyan tirẹ ni awọn ipele meji: ṣiṣatunṣe tabili awọn iwuwo ati ṣajọ rẹ sinu fọọmu alakomeji pẹlu aṣẹ localdef.

Ni ibere fun tabili lafiwe lati ṣatunṣe pẹlu awọn idiyele ṣiṣatunṣe kekere, ni ọna kika ISO 14652 Awọn apakan fun ṣatunṣe awọn iwuwo ti tabili ti o wa tẹlẹ ti pese. Abala naa bẹrẹ pẹlu koko kan atunbere-lẹhin ati afihan ipo lẹhin eyi ti o ti ṣe atunṣe. Awọn apakan dopin pẹlu ila atunbere-opin. Ti o ba jẹ dandan lati ṣe atunṣe awọn apakan pupọ ti tabili, lẹhinna a ṣẹda apakan fun iru apakan kọọkan.

Mo ti daakọ titun awọn ẹya ti awọn faili iso14651_t1_wọpọ и ru_RU lati ibi ipamọ glibc si itọsọna ile mi ~ / . agbegbe / pin / i18n / agbegbe / ati satunkọ apakan diẹ LC_COLLATE в ru_RU. Awọn ẹya titun ti awọn faili wa ni ibamu ni kikun pẹlu ẹya mi glibc. Ti o ba fẹ lo awọn ẹya agbalagba ti awọn faili, iwọ yoo ni lati yi awọn orukọ aami pada ati aaye nibiti rirọpo bẹrẹ ni tabili.

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

Ni otitọ, yoo jẹ pataki lati yi awọn aaye sinu LC_IDENTIFICATION ki wọn tọka si agbegbe naa ru_MY, ṣugbọn ninu apẹẹrẹ mi eyi ko nilo, niwọn igba ti Mo ti yọ pamosi kuro ninu wiwa awọn agbegbe agbegbe-pamosi.

ti localdef ṣiṣẹ pẹlu awọn faili ninu folda mi nipasẹ oniyipada kan I18NPATH O le ṣafikun itọsọna afikun lati wa awọn faili titẹ sii, ati pe itọsọna lati ṣafipamọ awọn faili alakomeji le jẹ asọye bi ọna pẹlu awọn gige:

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

POSIX dawọle pe ni O kan o le kọ awọn ọna pipe si awọn ilana pẹlu awọn faili agbegbe, bẹrẹ pẹlu idinku siwaju, ṣugbọn glibc в Linux gbogbo awọn ọna ti wa ni kika lati ipilẹ liana, eyi ti o le wa ni danu nipasẹ a oniyipada LOCPATH. Lẹhin fifi sori LOCPATH=~/.local/lib/locale/ gbogbo awọn faili ti o ni ibatan si isọdibilẹ yoo wa nikan ninu folda mi. Ibi ipamọ ti awọn agbegbe pẹlu oniyipada ṣeto LOCPATH bikita.

Eyi ni idanwo ipinnu:

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

Hooray! A ṣe!

Ṣiṣẹ lori awọn idun

Mo ti dahun awọn ibeere tẹlẹ nipa yiyan okun ti o han ni ibẹrẹ, ṣugbọn awọn ibeere meji tun wa nipa awọn aṣiṣe - han ati airi.

Jẹ ká pada si awọn atilẹba isoro.

Ati eto naa too ati eto da lo kanna okun lafiwe awọn iṣẹ lati glibc. Bawo ni o ṣe ṣẹlẹ pe da fun aṣiṣe yiyan lori awọn ori ila ti a ṣeto nipasẹ aṣẹ too ni agbegbe en_US.UTF-8? Idahun si rọrun: too wé gbogbo okun, ati da ṣe afiwe bọtini nikan, eyiti nipasẹ aiyipada jẹ ibẹrẹ ti okun naa titi di ohun kikọ akọkọ funfunspace. Ninu apẹẹrẹ mi, eyi yorisi ifiranṣẹ aṣiṣe nitori tito awọn ọrọ akọkọ ninu awọn ila ko baamu tito awọn ila pipe.

Agbegbe "C" ṣe iṣeduro pe ninu awọn gbolohun ọrọ ti a ti ṣeto awọn ṣoki akọkọ ti o to aaye akọkọ yoo tun jẹ lẹsẹsẹ, ṣugbọn eyi nikan boju aṣiṣe naa. O ṣee ṣe lati yan data (awọn eniyan ti o ni awọn orukọ idile kanna, ṣugbọn awọn orukọ akọkọ ti o yatọ) pe, laisi ifiranṣẹ aṣiṣe, yoo fun abajade apapọ faili ti ko tọ. Ti a ba fe da awọn laini faili ti o dapọ nipasẹ orukọ kikun, lẹhinna ọna ti o tọ yoo jẹ lati pato pato oluyapa aaye ati lẹsẹsẹ nipasẹ aaye bọtini, kii ṣe nipasẹ gbogbo laini. Ni ọran yii, apapọ yoo tẹsiwaju ni deede ati pe ko si awọn aṣiṣe ni eyikeyi agbegbe:

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

Aṣeyọri ṣiṣe apẹẹrẹ ni fifi koodu ṣe CP1251 ni miran aṣiṣe. Otitọ ni pe ni gbogbo awọn pinpin ti a mọ si mi Linux Awọn idii ko padanu agbegbe akojọpọ ru_RU.CP1251. Ti a ko ba rii agbegbe ti o ṣajọ, lẹhinna too laiparuwo lo a baiti-nipasẹ-baiti lafiwe, eyi ti o jẹ ohun ti a woye.

Nipa ọna, glitch kekere miiran wa ti o ni ibatan si ailagbara ti awọn agbegbe ti a ṣajọpọ. Egbe LOCPATH=/tmp agbegbe -a yoo fun akojọ kan ti gbogbo awọn agbegbe ni agbegbe-pamosi, ṣugbọn pẹlu oniyipada ṣeto LOCPATH fun gbogbo awọn eto (pẹlu julọ agbegbe) awọn agbegbe wọnyi kii yoo wa.

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

ipari

Ti o ba jẹ pirogirama ti o lo lati ronu pe awọn okun jẹ ṣeto ti awọn baiti, lẹhinna yiyan rẹ LC_COLLATE=C.

Ti o ba jẹ onimọ-ede tabi olutọpa iwe-itumọ, lẹhinna o dara julọ lati ṣajọ ni agbegbe rẹ.

Ti o ba jẹ olumulo ti o rọrun, lẹhinna o kan nilo lati lo si otitọ pe aṣẹ naa ls -a Awọn abajade awọn faili ti o bẹrẹ pẹlu aami ti o dapọ pẹlu awọn faili ti o bẹrẹ pẹlu lẹta kan, ati Alakoso ọganjọ, ti o nlo awọn iṣẹ inu rẹ lati to awọn orukọ, fi awọn faili ti o bẹrẹ pẹlu aami ni ibẹrẹ ti akojọ.

jo

Iroyin No.. 10 Unicode collation algorithm

Awọn iwuwo ihuwasi ni unicode.org

ICU - imuse ti ile-ikawe kan fun ṣiṣẹ pẹlu Unicode lati IBM.

Tito idanwo nipa lilo ICU

Ohun kikọ òṣuwọn ni ISO 14651

Apejuwe ti ọna kika faili pẹlu awọn iwọn ISO 14652

Ifọrọwanilẹnuwo ti lafiwe okun ni glibc

orisun: www.habr.com

Fi ọrọìwòye kun